亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP.NET Web API 路由對象介紹

2019-11-17 01:40:21
字體:
來源:轉載
供稿:網友

asp.net Web API 路由對象介紹

ASP.NET Web API 路由對象介紹

前言

在ASP.NET、ASP.NET MVC和ASP.NET Web API這些框架中都會發現有路由的身影,它們的原理都差不多,只不過在不同的環境下作了一些微小的修改,這也是根據每個框架的特性來制定的,今天我們就來看一看路由的結構,雖然我在MVC系列里寫過路由的篇幅不過在這里是Web API 路由對象介紹。

ASP.NET Web API路由、管道

  • ASP.NET Web API 開篇介紹示例
  • ASP.NET Web API 路由對象介紹
  • ASP.NET Web API 管道模型
  • ASP.NET Web API selfhost宿主環境中管道、路由
  • ASP.NET Web API webhost宿主環境中管道、路由

路由系統概念

路由對象的結構

圖1

路由系統中最重要的部分也就是路由對象了,那我們首先就來看一下【路由對象】的定義,不管是在ASP.NET、ASP.NET MVC、還是ASP.NET Web API的路由系統中路由都要有個名稱,其實這個名稱并不是路由對象中的而是在注冊路由信息的時候,添加到路由對象集合的時候需要的名稱,這里也只是當作路由的一部分,這個大家知道就好了。

在生成路由對象的時候我們要給路由賦值URL模板,這也是共同的,也是必須的,至于約束URL模板的條件是可以根據自己情況來定義的。在生成的同時框架會給路由對象賦值上【路由請求處理程序】用以作為銜接路由系統和框架的主體功能部分。

注冊路由到系統框架中

圖2

在路由定義好之后,我們便會把它注冊到系統框架中。

路由對象的URL匹配

圖3

在路由對象注冊到系統框架中之后,這個時候如果有外部的請求的到達,這個時候路由系統會讓路由對象集合中每個路由對象對這個請求進行匹配,就如圖4一樣。

圖4

這個時候就是路由對象所要能做出的行為就是URL的匹配,根據什么來匹配?是根據在路由對象實例化的時候定義好的URL模板和條件,拿請求信息的URL和自身定義的URL模板進行匹配,假使沒有匹配成功則會返回Null,這個時候框架則會讓下一個路由對象來進行匹配直到有匹配的成功為止,如果這個時候匹配成功了路由則會生成一個【路由數據對象】。

路由數據對象也很重要,因為后續的框架功能部分都是使用它的,它也是整個路由系統的結晶,我們看下圖5

圖5

路由數據對象會保持一個生成它的路由對象的引用,然后是Values的是保存著路由對象在經過URL匹配后的值,分別表示著URL片段的名字和對應的URL真實值,而DataTokens則是在路由對象定義生成的時候直接帶過來的值,當然了路由請求處理程序也是由執行生成的路由對象帶來的。

在ASP.NET、ASP.NET MVC、ASP.NET Web API這些框架中路由系統都是遵循著上面的所述的這樣一個過程,只不過在不同的框架環境下使用的類型不同,做的處理也不太一樣,但是整體的流程是一致的,下面附上圖6說明了之間的類型的差異性,還有更多的細節就不一一展示了。

圖6

還有在Web API(WebHost)環境下路由顯示的是這樣實質的本質其實又是ASP.NET的路由系統在支持的,這個會在后面的Web API系列篇幅中講解。

下面簡單的演示一下在各種框架環境下的路由對象注冊,

ASP.NET:

RouteTable.Routes.MapPageRoute(                "ASP.NETRoute",                "

ASP.NET MVC:

            RouteTable.Routes.MapRoute(                "ASP.NETMVCRoute",                "ProductInfo/{action}/{id}",                new { controller="Product",action="show",id=RouteParameter.Optional}                );

ASP.NET Web API(WEBHOST):

            GlobalConfiguration.Configuration.Routes.MapHttpRoute(               "WebAPIRoute",               "api/{controller}/{id}", new { id = RouteParameter.Optional }               );

ASP.NET Web API(SELFHOST):

HttpSelfHostConfiguration configuration =                 new HttpSelfHostConfiguration("http://loacalhost/selfhost");            using (HttpSelfHostServer selfHostServer = new HttpSelfHostServer(configuration))            {                selfHostServer.Configuration.Routes.MapHttpRoute(                    "DefaultApi", "api/{controller}/{id}", new { id=RouteParameter.Optional});                               selfHostServer.OpenAsync();                Console.Read();            }

ASP.NET Web API 路由系列對象

從上圖的圖表中就可以看出,ASP.NET Web API框架在不同的宿主環境下路由系統中所對應的對象類型是不同的,這里就先給大家介紹在SelfHost環境下的路由系統中的路由對象吧。

SelfHost宿主環境

Web API路由對象(System.Web.Http.Routing)

HttpRoute

    // 摘要:    //     表示自承載(即在 ASP.NET 之外承載)的路由類。    public class HttpRoute : IHttpRoute    {        public HttpRoute(string routeTemplate, HttpRouteValueDictionary defaults, HttpRouteValueDictionary constraints, HttpRouteValueDictionary dataTokens, HttpMessageHandler handler);        public IDictionary<string, object> Constraints { get; }        public IDictionary<string, object> DataTokens { get; }        public IDictionary<string, object> Defaults { get; }        public HttpMessageHandler Handler { get; }        public string RouteTemplate { get; }        public virtual IHttpRouteData GetRouteData(string virtualPathRoot, HttpRequestMessage request);        public virtual IHttpVirtualPathData GetVirtualPath(HttpRequestMessage request, IDictionary<string, object> values);        protected virtual bool ProcessConstraint(HttpRequestMessage request, object constraint, string parameterName, HttpRouteValueDictionary values, HttpRouteDirection routeDirection);    }

可以從上面的定義中看到HttpRoute對象就是代表著在Web API框架中的路由對象了,在HttpRoute類型定義的構造函數中的參數分別表示著路由模板、路由模板對應的默認值、路由匹配條件、注冊的路由附帶的值以及最后的Http請求處理程序,這幾個參數值也分別對應著HttpRoute類型中的幾個屬性,這個自行看一下就明白了。

Web API路由對象集合(System.Web.Http)

HttpRouteCollection

HttpRouteCollectionExtensions

我們先來看一下HttpRouteCollection類型的擴展類型HttpRouteCollectionExtensions吧

    public static class HttpRouteCollectionExtensions    {        public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate);        public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults);        public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints);        public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler);    }

這里大家可以對比上面的路由注冊時的代碼,就可以知道我們在路由集合 添加/注冊 路由的時候是由HttpRouteCollectionExtensions類型的擴展方法來進行操作的,這個時候我們再看一下方法參數最多的那個MapHttpRoute()方法的實現:

public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler)        {            if (routes == null)            {                throw System.Web.Http.Error.ArgumentNull("routes");            }            HttpRouteValueDictionary dictionary = new HttpRouteValueDictionary(defaults);            HttpRouteValueDictionary dictionary2 = new HttpRouteValueDictionary(constraints);            IDictionary<string, object> dataTokens = null;            HttpMessageHandler handler2 = handler;            IHttpRoute route = routes.CreateRoute(routeTemplate, dictionary, dictionary2, dataTokens, handler2);            routes.Add(name, route);            return route;        }

這里大家就可以看到了,HttpRoute對象的創建操作和添加操作是在這擴展方法里執行的,現在我們就可以去看一下HttpRouteCollection類型的定義了,看一下如何創建的IHttpRoute對象:

    public class HttpRouteCollection : ICollection<IHttpRoute>, IEnumerable<IHttpRoute>, IEnumerable, IDisposable    {        public HttpRouteCollection();        public HttpRouteCollection(string virtualPathRoot);        public virtual int Count { get; }        public virtual bool IsReadOnly { get; }        public virtual string VirtualPathRoot { get; }        public virtual void Add(string name, IHttpRoute route);        public IHttpRoute CreateRoute(string routeTemplate, object defaults, object constraints);        public IHttpRoute CreateRoute(string routeTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens);        public virtual IHttpRoute CreateRoute(string routeTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens, HttpMessageHandler handler);        public virtual IHttpR
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91久久精品久久国产性色也91| 久久久久一本一区二区青青蜜月| 亚洲国产欧美一区二区三区同亚洲| 日韩激情在线视频| 久久久久久高潮国产精品视| 亚洲图片在线综合| 日韩激情在线视频| 欧美日韩精品中文字幕| 欧美放荡办公室videos4k| 国产精品一区二区久久久| 久久综合伊人77777| 亚洲伊人成综合成人网| 亚洲福利视频网| 91久久嫩草影院一区二区| 91成人天堂久久成人| 亚洲成人a**站| 国产日韩欧美电影在线观看| 精品成人乱色一区二区| 日韩欧美国产激情| 亚洲乱码av中文一区二区| 久久伊人91精品综合网站| 亚洲色图15p| 亚洲高清在线观看| 亚洲欧洲在线观看| 亚洲欧美日韩国产中文专区| 国模gogo一区二区大胆私拍| 中文字幕av一区中文字幕天堂| 欧美日韩国产一区二区| 91麻豆桃色免费看| 精品五月天久久| 亚洲精品97久久| 在线亚洲男人天堂| 在线日韩日本国产亚洲| 久久国产精品99国产精| 538国产精品视频一区二区| 欧美在线免费视频| 欧美主播福利视频| 亚洲激情自拍图| 亚洲欧美日韩中文视频| 91在线观看免费| 日韩欧美999| 亚洲久久久久久久久久| 国产精品久久久久久久久| 久久乐国产精品| 57pao成人永久免费视频| 欧美刺激性大交免费视频| 精品久久久久久久久久久久| 91老司机精品视频| 久久久久久久一| 欧美性xxxx极品hd欧美风情| 欧美激情精品久久久久久大尺度| 精品久久在线播放| 亚洲丝袜在线视频| 国产精品美女午夜av| 国产精品久久久久久av福利软件| 91精品久久久久久久久不口人| 亚洲人午夜精品免费| 久久这里有精品| 91香蕉亚洲精品| 成人免费自拍视频| 国产亚洲一级高清| 日韩在线视频网站| 国产精品久久久久av| 爱福利视频一区| 亚洲自拍偷拍网址| 97久久国产精品| 亚洲国产小视频在线观看| 亚洲精品综合久久中文字幕| 在线精品91av| 国产69精品久久久久9999| 国产成人精品久久| 社区色欧美激情 | 欧美大片大片在线播放| 精品高清美女精品国产区| 久久久电影免费观看完整版| 国产香蕉一区二区三区在线视频| 国产精品网站入口| 久久久久亚洲精品国产| 亚洲香蕉在线观看| 亚洲一区久久久| 亚洲国产天堂久久国产91| 欧美精品www在线观看| 久久久久久伊人| 国产精品旅馆在线| 精品日本高清在线播放| 波霸ol色综合久久| 欧美日韩另类在线| 精品中文字幕在线观看| 美日韩精品免费观看视频| 亚洲精品www| 日韩av最新在线| 欧美日韩色婷婷| 亚洲国内精品在线| 久久久久久欧美| 超薄丝袜一区二区| 国产精品美女呻吟| 九九九久久久久久| 91精品国产免费久久久久久| 亚洲女人天堂色在线7777| 最近免费中文字幕视频2019| 久久香蕉国产线看观看av| 亚洲人成绝费网站色www| 精品久久久久人成| 日韩av黄色在线观看| 亚洲综合中文字幕68页| 日韩av电影在线免费播放| 国产精品美女免费视频| 国产中文欧美精品| 欧美性猛交xxxxx水多| 精品国产鲁一鲁一区二区张丽| 日韩美女视频免费在线观看| 久久手机免费视频| 7m精品福利视频导航| 一区二区三区亚洲| 91在线观看免费高清| 色综合导航网站| 丝袜一区二区三区| 久久精品国产视频| 日本精品视频在线观看| 97在线视频免费观看| 91亚洲va在线va天堂va国| 91精品国产777在线观看| 亚洲网站在线观看| 日韩精品欧美国产精品忘忧草| 国产丝袜一区视频在线观看| 国产精品观看在线亚洲人成网| 亚洲奶大毛多的老太婆| 亚洲国产日韩欧美在线99| 亚洲人成网站在线播| 亚洲精品久久久久| 欧美日韩国产麻豆| 亚洲偷熟乱区亚洲香蕉av| 亚洲国产第一页| 在线精品高清中文字幕| 国语自产精品视频在免费| 亚洲毛茸茸少妇高潮呻吟| 成人美女免费网站视频| 秋霞成人午夜鲁丝一区二区三区| 日韩欧美亚洲范冰冰与中字| 精品久久久久久| 久久久国产一区二区三区| 欧美福利小视频| 亚洲国产高清福利视频| 亚洲精品电影在线观看| 久久久亚洲国产| 久久精品亚洲国产| 国产精品视频网| 亚洲精品电影在线| 裸体女人亚洲精品一区| 欧美成aaa人片在线观看蜜臀| 日韩中文字幕视频在线观看| 亚洲国产又黄又爽女人高潮的| 亚洲午夜精品久久久久久性色| 日韩欧美在线免费观看| 亚洲一区精品电影| 色多多国产成人永久免费网站| 高清日韩电视剧大全免费播放在线观看| 日韩欧美亚洲成人| 中文字幕久热精品在线视频| 午夜精品国产精品大乳美女| 精品一区二区三区四区在线| 国产成人精品久久二区二区| 国产mv免费观看入口亚洲| 亚洲福利视频在线|