ASP.NET Web API的路由和ASP.NET MVC相似,也是把路由放在RouteTable中的。可以在App_Start資料夾中的WebApiConfig.cs中設定路由模版。預設的路由模版是:
routes.MapHttpRoute(name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
● 靜態片段api,主要用來區分ASP.NET MVC的路由。
● 為什麼沒有{action}?預設情況下,可以根據慣例找到Action,只要Action的名稱符合慣例。
● 佔位符變數{id}對映Action的引數。
□ 根據慣例路由
對於GET,POST,PUT,DELETE請求,如果Action的名稱以Get, Post, Put, Delete開頭,這就是符合慣例,意味著在請求的url中無需指明Action,就可以路由到對應的Action中。
假設有這樣的一個api控制器:
public class BooksController : ApiController{public void GetAllBooks(){}public IEnumerable<Book> GetBookById(int id)public HttpResponseMessage DeleteProduct(int id){}}
● 瀏覽器輸入:api/books 並且是Get請求
不帶引數,由於GetAllBooks的名稱以Get開頭,符合慣例,這裡會對映到GetAllBooks方法。
● 瀏覽器輸入:api/books/8 並且是Get請求
帶引數,會對映到GetBookById(int id)方法上。Web API會把字串型別的8賦值給int型別的引數變數id。
● 瀏覽器輸入:api/books/8 並且是DELETE請求
對映到DeleteProduct(int id)
● 瀏覽器輸入:api/books 並且是POST請求
沒有對應POST請求的Action。返回404狀態碼。
□ 根據HTTP方法路由
HttpGet, HttpPut, HttpPost, HttpDelete屬性可以打在Action上面。
public class BooksController : ApiController{[HttpGet]public Book FindBook(id){}
}
如果一個Action允許有多個HTTP方法,就使用AcceptVerbs屬性。
public class BooksController ; ApiController{[AcceptVerbs("GET","HEAD")]public Book FindProduct(id){}
}
□ 考慮Action的路由
我們可以在WebApiConfig.cs中設定路由的模版,把Action考慮進去。
routes.MapHttpRoute(name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
在api控制器中:
public class BooksController : ApiController{[HttpGet]public string Details(int id);}
此時,在瀏覽器中輸入類似"api/books/details/8"的格式,才能對映到Details(int id)方法上。
還可以通過ActionName屬性給Action取別名:
public class BooksController : ApiController{[ActionName("Sth")]
public HttpResposneMessage GetSth(int id);}
如果不想讓Action參與到路由中,可以使用NoAction屬性。
public class BooksController : ApiController{[NonAction]public string GetSomeData(){}}
總結:在WebApiConfig.cs中定義的路由模版都被放到了RouteTable中了。在Action層面,如果想讓請求路由到Action上,可以通過慣例、Http方法屬性來實現。