欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

ASP.NETWebAPIWebHost宿主環(huán)境中管道、路由-創(chuàng)新互聯(lián)

ASP.NET Web API WebHost宿主環(huán)境中管道、路由


前言

上篇中說到ASP.NET Web API框架在SelfHost環(huán)境中管道、路由的一個(gè)形態(tài),本篇就來說明一下在WebHost環(huán)境中ASP.NET Web API框架中的管道、路由又是哪一種形態(tài)。

專注于為中小企業(yè)提供網(wǎng)站制作、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)陵水黎族免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

ASP.NET Web API路由、管道

  • ASP.NET Web API 開篇介紹示例

  • ASP.NET Web API 路由對(duì)象介紹

  • ASP.NET Web API 管道模型

  • ASP.NET Web API selfhost宿主環(huán)境中管道、路由

  • ASP.NET Web API webhost宿主環(huán)境中管道、路由

ASP.NET Web API webhost宿主環(huán)境中管道、路由

下面將會(huì)主要講解路由的注冊(cè)執(zhí)行過程(WebHost環(huán)境),對(duì)于管道不會(huì)去刻意的說明,都會(huì)包含在路由的講解中,拆開來說明效果不太好。

HttpRoute->HostedHttpRoute->HttpWebRoute->Route

想要清楚的了解路由的執(zhí)行過程以及管道的形態(tài),就必須對(duì)路由對(duì)象熟知,然而在前面的《ASP.NET Web API 路由對(duì)象介紹》篇幅中只是分別的對(duì)各個(gè)環(huán)境下的路由對(duì)象類型進(jìn)行了說明,并沒有說明轉(zhuǎn)變的過程。

現(xiàn)在就來講解路由對(duì)象的“轉(zhuǎn)變”過程。

示例代碼1-1

        protected void Application_Start(object sender, EventArgs e)
        {
            GlobalConfiguration.Configuration.Routes.MapHttpRoute(
              "DefaultAPI", "api/{controller}/{id}", new { controller="product",id = RouteParameter.Optional });
        }

示例代碼1-1中是在WebHost環(huán)境下進(jìn)行的路由注冊(cè),根據(jù)MapHttpRoute()方法我們轉(zhuǎn)定義過去應(yīng)該是一個(gè)HttpRouteCollection類型的擴(kuò)展方法類型HttpRouteCollectionExtensions,既然是HttpRouteCollectionExtensions類型里的實(shí)現(xiàn)那我們就過去看看到底啥情況。

示例代碼1-2

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;
        }

我們可以看到返回類型是IHttpRoute,生成則是由HttpRouteCollection類型的實(shí)例調(diào)用其中的CreateRoute()方法來實(shí)現(xiàn),這里有的朋友要問了,這不是SelfHost中的路由注冊(cè)實(shí)現(xiàn)方式嗎?回答是對(duì)的,只不過在WebHost中利用多態(tài)來實(shí)現(xiàn)返回成其他的類型,接著往下看。

既然都看到了在這里發(fā)生的變化,那說明是有繼承了HttpRouteCollection類型的這么一個(gè)類型然后創(chuàng)建的路由對(duì)象。這樣一理就清晰多了,在SelfHost環(huán)境中HttpRouteCollection類型是存在于HttpConfiguration類型的對(duì)象中,并不單獨(dú)使用。而在WebHost中也是。

這個(gè)時(shí)候我們?cè)倩剡^頭來看一下代碼1-1中的GlobalConfiguration類型中的定義。

示例代碼1-3

        private static Lazy<HttpConfiguration> _configuration = new Lazy<HttpConfiguration>(delegate {
            HttpConfiguration configuration = new HttpConfiguration(new HostedHttpRouteCollection(RouteTable.Routes));
            configuration.Services.Replace(typeof(IAssembliesResolver), new WebHostAssembliesResolver());
            configuration.Services.Replace(typeof(IHttpControllerTypeResolver), new WebHostHttpControllerTypeResolver());
            configuration.Services.Replace(typeof(IHostBufferPolicySelector), new WebHostBufferPolicySelector());
            return configuration;
        });
        public static HttpConfiguration Configuration
        {
            get
            {
                return _configuration.Value;
            }
        }

從代碼1-3中我們可以看到_configuration靜態(tài)變量使用了延遲加載,啥意思呢就是下面的那個(gè)HttpConfiguration類型的Configuration屬性如果使用了才會(huì)去實(shí)例化,跑偏了這不是重點(diǎn)。

重點(diǎn)是在實(shí)例化靜態(tài)變量_configuration中可以清楚的看到使用了HostedHttpRouteCollection類型的路由集合類型對(duì)象作為構(gòu)造函數(shù)參數(shù)。可以自行的去看一下HostedHttpRouteCollection的內(nèi)部結(jié)構(gòu)。

現(xiàn)在再回到創(chuàng)建路由的那會(huì),也就是代碼1-1和代碼1-2中所示的那樣,實(shí)際也就是HostedHttpRouteCollection類型在創(chuàng)建路由對(duì)象,按照老規(guī)矩直接看實(shí)現(xiàn)代碼。

示例代碼1-4

public override IHttpRoute CreateRoute(string uriTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens, HttpMessageHandler handler)
    {
        return new HostedHttpRoute(uriTemplate, defaults, constraints, dataTokens, handler);
    }

從代碼1-4中可以清楚的看到是返回的是HostedHttpRoute路由對(duì)象,我們可以看一下構(gòu)造函數(shù),只有這樣才能知道&ldquo;轉(zhuǎn)變&rdquo;的過程。

        public HostedHttpRoute(string uriTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens, HttpMessageHandler handler)
    {
        RouteValueDictionary dictionary = (defaults != null) ? new RouteValueDictionary(defaults) : null;
        RouteValueDictionary dictionary2 = (constraints != null) ? new RouteValueDictionary(constraints) : null;
        RouteValueDictionary dictionary3 = (dataTokens != null) ? new RouteValueDictionary(dataTokens) : null;
        this.OriginalRoute = new HttpWebRoute(uriTemplate, dictionary, dictionary2, dictionary3, HttpControllerRouteHandler.Instance, this);
        this.Handler = handler;
   }

在代碼1-4中我們只需要關(guān)注OriginalRoute屬性的賦值,OriginalRoute屬性是HostedHttpRoute類型里的一個(gè)屬性,是用來設(shè)置對(duì)Route對(duì)象的引用,示例代碼1-4中也就是HttpWebRoute類型的對(duì)象,對(duì)于HttpWebRoute對(duì)象的構(gòu)造函數(shù)這里就不例舉了。這個(gè)時(shí)候可以看到是將HttpControllerRouteHandler類型的對(duì)象作為Route(HttpWebRoute)對(duì)象的RouteHandler(路由處理程序)。

大家都知道ASP.NET Web API框架在WebHost環(huán)境中是依賴于ASP.NET的,實(shí)則也是通過IHttpModule來進(jìn)行前期的消息攔截,下面我們看一下在HttpModule中的代碼(我想應(yīng)該是這樣的,如果有誤請(qǐng)指點(diǎn)。)

示例代碼1-5

    public class WebAPIHttpModule:IHttpModule
    {


        public void Dispose()
        {
            throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
            context.PostResolveRequestCache += context_PostResolveRequestCache;
        }

        void context_PostResolveRequestCache(object sender, EventArgs e)
        {
            HttpApplication context = sender as HttpApplication;
            HttpContextWrapper contextWrapper = new HttpContextWrapper(context.Context);
            RouteData routeData = RouteTable.Routes.GetRouteData(contextWrapper);
            RequestContext requestContext=new RequestContext(contextWrapper,routeData);
            IHttpHandler httpHandler = routeData.RouteHandler.GetHttpHandler(requestContext);
            IHttpAsyncHandler httpAsyncHandler = httpHandler as IHttpAsyncHandler;
            httpAsyncHandler.BeginProce***equest(context.Context, null, null);
        }
     }

在代碼1-5中我們可以看到首先是獲取了RouteData對(duì)象實(shí)例,以此獲取RouteHandler,然后根據(jù)RequestContext獲取IHttpHandler,再轉(zhuǎn)換為IHttpAsyncHandler類型的實(shí)例,然后調(diào)用其BeginProce***equest()方法來執(zhí)行操作。

上面這段話描述的是上述代碼的執(zhí)行過程,有的朋友可能會(huì)疑問了,怎么就獲取RouteData了?

這里我給大家解釋一下,在我們的代碼1-2中,有這樣的代碼:

                        IHttpRoute route = routes.CreateRoute(routeTemplate, dictionary, dictionary2, dataTokens, handler2);
            routes.Add(name, route);

首先我們看第一句,這里的route上面說過了是HostedHttpRoute對(duì)象,這里毫無疑問直接過,然后我們?cè)倏吹诙?,這里的routes是HostedHttpRouteCollection對(duì)象不假,但是這個(gè)Add()方法添加的方向不是HostedHttpRouteCollection,而是由我們一開始在GlobalConfiguration類型中說過的RouteTable.Routes,當(dāng)前環(huán)境是什么?ASP.NET框架環(huán)境對(duì)吧!毫無疑問這個(gè)Add()方法把上面所說的route(HostedHttpRoute對(duì)象)添加到了當(dāng)前環(huán)境的RouteTable.Routes中,有的朋友會(huì)問了類型不對(duì)。確實(shí)是不對(duì)的在添加的時(shí)候route(HostedHttpRoute對(duì)象)會(huì)轉(zhuǎn)換成HttpWebRoute對(duì)象,HttpWebRoute對(duì)象繼承自Route,可以看前面的篇幅,想必說到這里大家應(yīng)該明白了。這里我就不多說了。

我們接著回到代碼1-5中,在獲取了RouteData之后通過RouteHandler的GetHttphandler()方法獲取IHttpHandler實(shí)例,在RouteData中的這個(gè)RouteHandler毫無疑問就是HttpControllerRouteHandler類型。

我們來看下HttpControllerRouteHandler類型中的GetHttphandler()方法:

    protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new HttpControllerHandler(requestContext.RouteData);
    }

可以看到是由HttpControllerHandler這個(gè)對(duì)象類型來執(zhí)行最后的操作,那我們就來看一下這個(gè)類型的定義:

public class HttpControllerHandler : IHttpAsyncHandler, IHttpHandler

現(xiàn)在大家明白為什么要轉(zhuǎn)成IHttpAsyncHandler了吧,因?yàn)槿绻{(diào)用了實(shí)現(xiàn)了IHttpHandler接口的函數(shù)是會(huì)報(bào)出異常的,因?yàn)樵贖ttpControllerHandler類型中并沒有實(shí)現(xiàn)IHttpHandler接口只是一個(gè)空殼,然后我們?cè)倏匆幌翲ttpControllerHandler類型的靜態(tài)構(gòu)造函數(shù):

圖1

ASP.NET Web API WebHost宿主環(huán)境中管道、路由

這個(gè)_server是Lazy<HttpMessageInvoker>類型,在BeginProce***equest()方法中會(huì)執(zhí)行SendAsync()以此進(jìn)入ASP.NET Web API的管道。

下面我們看一下整體的一個(gè)示意圖,

圖2

ASP.NET Web API WebHost宿主環(huán)境中管道、路由

最后對(duì)于HttpControllerDispatcher類型在控制器部分講解。

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

本文題目:ASP.NETWebAPIWebHost宿主環(huán)境中管道、路由-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://aaarwkj.com/article38/dgossp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
久久精品欧美日韩视频| 欧洲精品久久久久久| 免费av在线网址网站| 人妻少妇被猛烈进入中出视频| 亚洲一区二区三区黄色| 成人免费亚洲av在线| 手机黄色av免费在线网址| 熟妇人妻精品一区二区三区颏| 国内精品av在线观看| 91精品久久久久久| 97成人在线视频免费| 自拍一区日韩二区欧美三区| 精品国产一区=区三区乱码| 国产精品一区二区av在线| 中文字幕亚洲精品乱码在线| 亚洲精品国产精品乱码不卞| 色哟哟亚洲精品在线视频| 黑人精品一区二区三区| 亚洲巨大黑人一区二区三区| 亚洲国产精品一区二区成人| 亚洲男人天堂免费观看| 亚洲视频欧美视频自拍偷拍| 国产女主播高清在线视频| 亚洲午夜精品日韩乱码| 亚洲老熟女老妇老女人| 国产免费不卡午夜福利在线| 黄色片黄色片美女黄色片亚洲黄色片| 成人一区二区三区播放| 国产69精品久久一级| 日本一本高清免费不卡| 99精品国产一区二区青青性色| 麻豆国产自拍在线视频| 一区二区三区精品人妻| 性生活免费在线观看视频| 亚洲午夜精品日韩乱码| 成人看片亚欧大片在线观看| 亚洲欧美另类重口国产| 免费av在线网址网站| 欧美大片黄片在线观看| 粗长挺进新婚人妻诗岚| 精品视频美女肉体亚洲|