標籤:style blog http io color os ar 使用 sp
預設的規則
在ASP.NET MVC4中
global.asax.cs代碼中並無註冊預設路由規則的代碼
代碼如下:
public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } }
那麼預設的路由規則是在哪裡註冊的呢?
我們發現
在項目中多了一個App_Start檔案夾
其中RoteConfig.cs檔案就是註冊預設路由規則的程式所在了
代碼如下:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
這裡有兩個路由規則
一個是針對API請求的路由規則
另一個是針對普通MVC頁面請求的路由規則
請求路徑以字串”api”開頭的時候將訪問webAPI的函數
(註:至於為什麼用MapHttpRoute而不是MapRoute;為什麼用routeTemplate而不是用url我們再以後的章節介紹)
因為routeTemplate中有了{controller}
所以針對api的請求可以自動對應到指定的controller類
那麼是怎麼找到合適的Action的呢?
系統根據請求的方式來判斷
如果是以GET的方式請求的
那麼將匹配controller中以“Get”開頭的Action
如果是以POST的方式請求的
那麼將匹配controller中以“Post”開頭的Action
如果是以PUT的方式請求的
那麼將匹配controller中以“Put”開頭的Action
如果是以DELETE的方式請求的
那麼將匹配controller中以“Delete”開頭的Action
除了這幾個預設的請求方式
你還可以在用戶端定義你自己的請求方式!
routeTemplate最後面的id匹配Action中的參數,
這與ASP.NET MVC一致
初步的自訂
那麼是不是所有的匹配GET請求的Action都必須以“Get”開頭呢
不是的
我們可以用方法特性來標記一個方法屬於什麼什麼請求
如下:
[HttpGet] public IEnumerable<Product> AllProducts() { return products; }
對應的方法特性還有
[HttpPost]
[HttpDelete]
[HttpPut]
亦可以使用如下這樣的方法特性來區分
[AcceptVerbs("GET")]
[AcceptVerbs("GET", "HEAD")]
另外如果你在Controller中寫了一個函數
必須是public的,必須以Get開頭
而又不想讓用戶端以請求到此Action
那麼可以使用方法特性
[NonAction]
來標記此方法
進一步自訂
我們仍然可以把action的名字放到預設的請求規則中
只要把routeTemplate改為如下即可:
routes.MapHttpRoute( name: "ActionApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
ASP.NET Web API路由規則(二)