WebApi-2 自定義路由與默認路由


向Web API添加路由

public static void Register(HttpConfiguration config)
    {
            //// Web API 配置和服務
            //// 將 Web API 配置為僅使用不記名令牌身份驗證。
            //config.SuppressDefaultHostAuthentication();
            //config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API 啟用特性路由
            config.MapHttpAttributeRoutes();
            //1.默認路由
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional },
                constraints: new { id = @"\d*" } //約束,這個表示匹配0個或多個數字
                //constraints: new { id = @"\d+" }  //正則\d+表示匹配一個或多個數字
            );

            //2.自定義路由一:匹配到action
            config.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "actionapi/{controller}/{action}/{id}",  //將路由模板的前綴改成了“actionapi”。
                defaults: new { id = RouteParameter.Optional }
            );

            //3.自定義路由二
            config.Routes.MapHttpRoute(
                name: "TestApi",
                routeTemplate: "testapi/{controller}/{ordertype}/{id}",
                defaults: new { ordertype = "aa", id = RouteParameter.Optional }//只要{ordertype}按照路由規則去配置,都能找到對應的方法。
            );
        }

Web API路由過程

1、WebApi服務啟動之后,會執行全局配置文件Global.asax.cs的 protected void Application_Start(){GlobalConfiguration.Configure(WebApiConfig.Register);} 方法,通過參數委托執行WebApiConfig.cs里面的 public static void Register(HttpConfiguration config) 這個方法,將所有配置的路由信息添加到 HttpRouteCollection 對象中。查看配置對象,我們會發現Routes屬性指向HttpRouteCollection類的一個實例,而不是ASP.NET的RouteCollection類實例。Web API提供了一些直接依賴ASP.NET中RouteCollection類的MapHttpRoute版本,但這些路由只有在Web托管時才能使用,因此推薦使用HttpRouteCollection上的MapHttpRoute版本。

2、當我們發送請求到WebApi服務器的時候,比如我們訪問http://localhost:21528/api/Order這個url的時候,請求首先還是會被UrlRoutingModule監聽組件截獲,然后,將截獲的請求在Routes路由集合中匹配到對應的路由模板(如果匹配不到對應的路由模板,則返回404),得到對應的IHttpRoute對象。IHttpRoute對象是Routes集合里面匹配到的一個實體。

3、將IHttpRoute對象交給當前的請求的上下文對象RequestContext處理,根據IHttpRoute對象里面的url匹配到對應的controller,然后再根據http請求的類型和參數找到對應的action。這樣一個請求就能找到對應的方法了。 

一個請求過來之后,路由主要需要經歷三個階段

    1. 根據請求的url匹配路由模板
    2. 找到控制器  (反編譯路由模塊的代碼,你會發現控制器的選擇主要在IHttpControllerSelector這個接口的SelectController()方法里面處理。)
    3. 找到action (得到了控制器對象之后,Api引擎通過調用IHttpActionSelector這個接口的SelectAction()方法去匹配action。)

使用特性路由

如果http請求的方法相同(比如都是post請求),並且請求的參數也相同。我們可以在路由模板里面加上“{action}”,但是不提倡。推薦使用特性路由解決這個問題。下面代碼說明如何如何使用特性路由。

[RoutePrefix("api/order")] //同一個控制器的所有的action的所有特性路由標識一個相同的前綴,這種做法並非必須,但這樣能夠增加url的可讀性。
    public class OrderController : ApiController
    {
        [HttpGet]
        public object GetAll()
        {
            return "Success";
        }

        [ActionName("TestApi")]  //如果你想要方法名和action的名稱不一致,你也可以自定義action的名稱,這個可以通過特性ActionName來實現
        [Route("{id:int=3}/OrderDetailById")]  //使用“{}”占位符動態傳遞參數,參數約束:這里約束可變部分{id}的取值必須是int類型。並且默認值是3.
        [HttpGet]
        public object GetById(int id)
        {
            return "Success" + id;
        }

        [HttpGet]
        public async Task<string> Get(string str)
        {
            GetDataHelper sqlHelper = new GetDataHelper();
            switch (str)
            {
                case "異步處理"://
                    return await sqlHelper.GetDataAsync();
                case "同步處理"://
                    return sqlHelper.GetData();
            }
            return "參數不正確";
        }       
    }

 


免責聲明!

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



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