今天復習一下WebAPI的路由知識:
首先分析一下MVC路由和WebAPI路由的區別:
在mvc里,默認的路由機制是通過URL路徑去匹配控制器和Action方法的,在mvc中的默認路由定義在App_Start文件夾下的RouteConfig.cs文件下:
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
在webapi里,默認的路由機制是通過URL路徑去匹配控制器,然后通過http的方法去匹配Action的,在WebAPI中的默認路由定義在App_Start文件夾下的WebApiConfig.cs文件下:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服務 // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "RestFulApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
WebApi的路由基礎:
將MapHttpRoute方法轉定義有4個重載的方法:
// // 摘要: // 映射指定的路由模板。 // // 參數: // routes: // 應用程序的路由的集合。 // // name: // 要映射的路由的名稱。 // // routeTemplate: // 路由的路由模板。 // // 返回結果: // 對映射路由的引用。 public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate); // // 摘要: // 映射指定的路由模板並設置默認路由值。 // // 參數: // routes: // 應用程序的路由的集合。 // // name: // 要映射的路由的名稱。 // // routeTemplate: // 路由的路由模板。 // // defaults: // 一個包含默認路由值的對象。 // // 返回結果: // 對映射路由的引用。 public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults); // // 摘要: // 映射指定的路由模板並設置默認路由值和約束。 // // 參數: // routes: // 應用程序的路由的集合。 // // name: // 要映射的路由的名稱。 // // routeTemplate: // 路由的路由模板。 // // defaults: // 一個包含默認路由值的對象。 // // constraints: // 一組表達式,用於指定 routeTemplate 的值。 // // 返回結果: // 對映射路由的引用。 public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints); // // 摘要: // 映射指定的路由模板並設置默認的路由值、約束和終結點消息處理程序。 // // 參數: // routes: // 應用程序的路由的集合。 // // name: // 要映射的路由的名稱。 // // routeTemplate: // 路由的路由模板。 // // defaults: // 一個包含默認路由值的對象。 // // constraints: // 一組表達式,用於指定 routeTemplate 的值。 // // handler: // 請求將被調度到的處理程序。 // // 返回結果: // 對映射路由的引用。 public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler);
看看每個參數的作用:
name:表明路由的名稱,注冊多個路由時保證不重復就行;
routeTemplate:路由匹配規則。默認是“api/{controller}/{id}”,前面的api是用來區分mvc路由的,不是必選項,是可變的,{controller}是控制器的占位符,{id}是形參的占位符;
defaults:一個包含默認路由值的對象,可以設置controller的默認值;
constraints:對形參的約束;
注冊的路由是按照注冊先后的順序進行匹配的,注冊越靠前,優先級越大
我們知道,WebApi是符合RESTful風格的,那么如果在一個控制器內部,我們需要提供多個相同的http方法,相同參數的接口我們應該怎么解決呢?
1:活用[Route("")]
在相同請求方法的action的前面可以加上[Route]路由特性進行區分:
routeTemplate:路由匹配規則。默認是“api/{controller}/{id}”,前面的api是用來區分mvc路由的,不是必選項,是可變的,{controller}是控制器的占位符,{id}是形參的占位符;
defaults:一個包含默認路由值的對象,可以設置controller的默認值;
constraints:對形參的約束;
注冊的路由是按照注冊先后的順序進行匹配的,注冊越靠前,優先級越大
我們知道,WebApi是符合RESTful風格的,那么如果在一個控制器內部,我們需要提供多個相同的http方法,相同參數的接口我們應該怎么解決呢?
1:活用[Route("")]
在相同請求方法的action的前面可以加上[Route]路由特性進行區分:
/// <summary> /// 這里可以通過http://localhost:xxxx/api/Values對這個action進行訪問 /// </summary> /// <returns></returns> public IEnumerable<string> Get1() { return new string[] { "value1", "value2" }; } /// <summary> /// 這里可以通過http://localhost:xxxx/apis/Values/qqqqq對這個action進行訪問 /// </summary> /// <returns></returns> [Route("apis/Values/qqqqq")] public IEnumerable<string> Get2() { return new string[] { "value3", "value4" }; }
和朋友聊了一下,發現這個做法本身就和RESTful風格相抵觸,所以就不深究了,一般是對action進行重載,而不是在這上面想辦法。