Routing by Naming Convention
在App_Start/ WebApiConfig.cs文件中
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
步骤:
1) 进行路由匹配,若匹配失败则返回404
2) 找到对应的Controller
3) 找到对应的Action。
原则1:根据HTTP的方法,找以该方法开头的函数。例如,HTTP的GET方法可以对应 GetUser(int id)或者GetAllUser()
原则2:在1基础上,如果其他可选的参数设置了(例如{id}),则选择相应满足的函数。
原则3:如果不存在对应的action,则调用失败
Routing by Explicitly Specification
- 使用HttpGet, HttpPut, HttpPost, HttpDelete 关键字,显式说明
- AcceptVerbs关键字一次声明多个HTTP方法
public class ProductsController : ApiController
{
[HttpGet]
public Product FindProduct(id) {} [AcceptVerbs("GET", "HEAD")]
public Product FindProduct(id) { }
}
Routing by Action Name
1) 依据URI中的Action字段选择Action
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
2) Action函数前,声明允许的HTTP方法
public class ProductsController : ApiController
{
[HttpGet]
public string Details(int id);
}
第二步中,也可以对一个Action进行重载,使用ActionName关键字
public class ProductsController : ApiController
{
[HttpGet]
[ActionName("Thumbnail")]
public HttpResponseMessage GetThumbnailImage(int id); [HttpPost]
[ActionName("Thumbnail")]
public void AddThumbnailImage(int id);
//防止被调用声明
[NonAction]
public string GetPrivateData() { ... }
}