[翻译]ASP.NET Web API的路由
在我们新建一个Web API项目时,会在App_Start文件夹下的WebApiConfig.cs中定义一个默认路由:
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
在默认路由中加入“api”是为了避免与ASP.NET MVC的路由冲突。当然如果你不喜欢这个约定,可以修改默认路由。
路由匹配规则:{controller}和{id}略过,只介绍action的匹配。
1.Web API首先根据HTTP方法名寻找命名以HTTP方法名开头的action。举例:
public class ProductsController : ApiController { public void GetAllProducts() { } public IEnumerable<Product> GetProductById(int id) { } public HttpResponseMessage DeleteProduct(int id){ } }
2.但是上面的约定只适用于GET、POST、PUT和DELETE方法。其他的HTTP方法可以使用AcceptVerbs attribute匹配,前面的四种方法亦同样适用。举例:
public class ProductsController : ApiController { [HttpGet] public Product FindProduct(id) {} }
public class ProductsController : ApiController { [AcceptVerbs("GET", "HEAD")] public Product FindProduct(id) { } // WebDAV method [AcceptVerbs("MKCOL")] public void MakeCollection() { } }
3.根据action名匹配(重写路由)。举例:
routes.MapHttpRoute( name: "ActionApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
3.1.根据上面的路由规则“api/products/details/1”的GET请求将会匹配:
public class ProductsController : ApiController { [HttpGet] public string Details(int id); }
3.2.可以使用ActionName attribute重写action名。举例:
public class ProductsController : ApiController { [HttpGet] [ActionName("Thumbnail")] public HttpResponseMessage GetThumbnailImage(int id); [HttpPost] [ActionName("Thumbnail")] public void AddThumbnailImage(int id); }
这样"api/products/thumbnail/id”就有两个匹配,分别对应GET和POST。
4.如果一个方法不想被当作action调用,可以使用NonAction attribute,举例:
// Not an action method. [NonAction] public string GetPrivateData() { ... }
posted on 2015-06-11 16:10 Walden1024 阅读(212) 评论(0) 编辑 收藏 举报