C#進階之WebAPI(三)


今天復習一下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]路由特性進行區分:

/// <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進行重載,而不是在這上面想辦法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM