標籤:
原文:Routing in 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() { ... }
[翻譯]ASP.NET Web API的路由