欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

ASP.NETWebAPISelfhost宿主環(huán)境中管道、路由

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

前言

成都一家集口碑和實力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團(tuán)隊和靠譜的建站技術(shù),十年企業(yè)及個人網(wǎng)站建設(shè)經(jīng)驗 ,為成都千余家客戶提供網(wǎng)頁設(shè)計制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營銷型網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,同時也為不同行業(yè)的客戶提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選成都創(chuàng)新互聯(lián)

前面的幾個篇幅對Web API中的路由和管道進(jìn)行了簡單的介紹并沒有詳細(xì)的去說明一些什么,然而ASP.NET Web API這個框架由于宿主環(huán)境的不同在不同的宿主環(huán)境中管道中的實現(xiàn)機(jī)制和路由的處理方式有著很大的不同,所以我會將對應(yīng)不同的宿主環(huán)境來分別的做出簡單的講解。

 

 

ASP.NET Web API路由、管道

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

  • ASP.NET Web API路由對象介紹

  • ASP.NET Web API管道模型

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

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

 

ASP.NET Web API SelfHost宿主環(huán)境管道

首先我們先來看個示意圖,大概的描述了在SelfHost宿主環(huán)境中管道形態(tài)。

圖1

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

因為在WebHost宿主環(huán)境中ASP.NET Web API的管道請求接收以及響應(yīng)的返回最后都是由ASP.NET來包辦的(下一篇中講解),而在SelfHost宿主環(huán)境中就苦逼了,沒有那么簡單了。

 

我們按照圖1中示意的來講解,首先在SelfHost宿主環(huán)境中的項目啟動之后(當(dāng)然項目要使用Web API框架的),會有一個HttpBinding對象(System.Web.Http.SelfHost.Channels),那這個HttpBinding類型的對象是干嘛的呢?Httpbinding對象對應(yīng)著一些個BindingElement對象,而這些BindingElement又各自生成對應(yīng)的管道層監(jiān)聽器,這樣就如圖1中所示的那樣,現(xiàn)在我們看一下如下的示例代碼,看看HttpBinding到底對應(yīng)著哪些BindingElement對象。

示例代碼1-1

   publicclassHttpBinding : Binding, IBindingRuntimePreferences
   {
        publicHttpBinding()
        {
            this.Initialize();
        }
        privatevoidInitialize()
        {
            this._security=newHttpBindingSecurity();
            this._httpTransportBindingElement=newHttpTransportBindingElement();
            this._httpTransportBindingElement.ManualAddressing=true;
            this._httpsTransportBindingElement=newHttpsTransportBindingElement();
            this._httpsTransportBindingElement.ManualAddressing=true;
            this._httpMessageEncodingBindingElement=newHttpMessageEncodingBindingElement();
       }
}

在示例代碼1-1中我們可以清楚的看到在HttpBinding對象的構(gòu)造函數(shù)中分別的對幾種BindingElement進(jìn)行了實例化賦值,我們只對其中的HttpTransportBindingElement和HttpMessageEncodingBindingElement進(jìn)行講解也就是圖1中所示的那樣。

HttpTransportBindingElement對象的主要職責(zé)就是生成相對應(yīng)的管道監(jiān)聽器,這里對應(yīng)的就是IChannelListener<TChannel>泛型類型了,而生成好對應(yīng)的管道監(jiān)聽器之后,監(jiān)聽器之后會開始監(jiān)聽與之對應(yīng)的管道層,與HttpTransportBindingElement對象以及監(jiān)聽器對應(yīng)的也就是TransprotChannel管道層了,它負(fù)責(zé)請求消息的接收和響應(yīng)消息的發(fā)送。

HttpMessageEncodingBindingElement類型的對象所做操作同HttpTransportBindingElement類型一致,都是先要生成對應(yīng)的管道監(jiān)聽器,在這里與之對應(yīng)的就是HttpMessageEncodingChannelListener類型,在監(jiān)聽器生成好之后也會去監(jiān)聽對應(yīng)的EncodingChannel管道層,而EncodingChannel管道層主要的作用就是將請求信息封裝為HttpMessage類型的消息對象,之后由HttpMessage消息對象進(jìn)入ASP.NET Web API框架的管道系統(tǒng)中。

 

上面說的是在請求未到達(dá)ASP.NET Web API框架的管道系統(tǒng)中的時候在外部的一些處理和操作,下面我們就要說明一下內(nèi)部,在上篇的《ASP.NET Web API 管道模型》篇幅中有示例代碼演示過在SelfHost環(huán)境下管道的注冊,我們這里看一下在SelfHost環(huán)境中Web API框架自身的管道系統(tǒng)里的對象的一些類型。

 

HttpSelfHostServer消息處理程序(實現(xiàn)類-管道頭)System.Web.Http.SelfHost

   publicsealedclassHttpSelfHostServer : HttpServer
   {
        publicHttpSelfHostServer(HttpSelfHostConfigurationconfiguration);
        publicHttpSelfHostServer(HttpSelfHostConfigurationconfiguration, HttpMessageHandlerdispatcher);
        publicTaskCloseAsync();
        protectedoverridevoidDispose(booldisposing);
        publicTaskOpenAsync();
}

可以看到HttpSelfHostServer類型繼承自HttpServer,在上篇中我們也就提到過HttpServer是繼承自DelegatingHandler抽象類型的消息處理程序基類,DelegatingHandler與HttpMessageHandler的不同之處就是多了個指向下一個處理程序的引用,當(dāng)然了作為一個管道系統(tǒng)中第一個消息處理程序必須是要有指向下一個處理程序引用的這么一個標(biāo)識,這樣是合理的。我們再看HttpSelfHostServer類型的構(gòu)造函數(shù)的參數(shù)類型。

HttpSelfHostConfiguration類型是繼承自HttpConfiguration類型的,在上篇中我們也說過,HttpConfiguration中可以配置管道中的大多數(shù)信息,這個大家可以自己去看一下。在重載構(gòu)造函數(shù)中有了第二個構(gòu)造函數(shù)參數(shù),HttpMessageHandler類型的參數(shù),在默認(rèn)使用HttpSelfHostServer的時候假使不使用這個重載的構(gòu)造函數(shù),那么在HttpSelfHostServer實例化的之前先實例化之前,其基類HttpServer的構(gòu)造函數(shù)開始執(zhí)行,所以在看下HttpServer類型的構(gòu)造函數(shù)的時候我們可以看到這里默認(rèn)設(shè)置的HttpMessageHandler類型的參數(shù)到底是什么樣子的。

publicHttpServer() : this(newHttpConfiguration())
        {
        }
        
        publicHttpServer(HttpMessageHandlerdispatcher) : this(newHttpConfiguration(), dispatcher)
        {
        }
        
        publicHttpServer(HttpConfigurationconfiguration) : this(configuration, newHttpRoutingDispatcher(configuration))
        {
        }
        
        publicHttpServer(HttpConfigurationconfiguration, HttpMessageHandlerdispatcher)
        {
            this._initializationLock=newobject();
            if (configuration==null)
            {
                throwSystem.Web.Http.Error.ArgumentNull("configuration");
            }
            if (dispatcher==null)
            {
                throwSystem.Web.Http.Error.ArgumentNull("dispatcher");
            }
            this._dispatcher=dispatcher;
            this._configuration=configuration;
        }

這里大家可以清楚的看到是HttpRoutingDispatcher類型作為管道的最后一個處理程序的類型,對于這個類型以及詳細(xì)的信息,在下面的路由小節(jié)中會有說明。

 

ASP.NET Web API SelfHost宿主環(huán)境路由

對于路由的其他知識這里就不說了,就是簡要的提一下在SelfHost中路由、管道的一些細(xì)節(jié)。

圖2

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

這里要詳細(xì)說明的就是HttpRoutingDispatcher類型中的SendAsync()方法,看下源碼中的實現(xiàn)這樣更清楚。

   publicclassHttpRoutingDispatcher : HttpMessageHandler
   {
        //Fields
        privatereadonlyHttpConfiguration_configuration;
        privatereadonlyHttpMessageInvoker_defaultInvoker;
 
        //Methods
        publicHttpRoutingDispatcher(HttpConfigurationconfiguration)
            : this(configuration, newHttpControllerDispatcher(configuration))
        {
        }
        protectedoverrideTask<HttpResponseMessage>SendAsync(HttpRequestMessagerequest, CancellationTokencancellationToken)
        {
            IHttpRouteDatarouteData;
            if (!request.Properties.TryGetValue<IHttpRouteData>(HttpPropertyKeys.HttpRouteDataKey, outrouteData))
            {
                routeData=this._configuration.Routes.GetRouteData(request);
                if (routeData==null)
                {
                    returnTaskHelpers.FromResult<HttpResponseMessage>(request.CreateErrorResponse(HttpStatusCode.NotFound, Error.Format(SRResources.ResourceNotFound, newobject[] { request.RequestUri }), SRResources.NoRouteData));
                }
                request.Properties.Add(HttpPropertyKeys.HttpRouteDataKey, routeData);
            }
            RemoveOptionalRoutingParameters(routeData.Values);
            HttpMessageInvokerinvoker= (routeData.Route.Handler==null) ?this._defaultInvoker : newHttpMessageInvoker(routeData.Route.Handler, false);
            returninvoker.SendAsync(request, cancellationToken);
        }
   }

我們先看一下HttpRoutingDispatcher類型中構(gòu)造函數(shù),可以看到在定義的構(gòu)造函數(shù)后面緊接著又在實例基類的構(gòu)造函數(shù),并且第二個HttpMessageHandler類型的參數(shù)為HttpControllerDispatcher實例的對象,這個我們先記住就行了。

下面我們還是回到HttpRoutingDispatcher類型的SendAsync()方法中,首先我們會看到從HttpRequestMessage對象實例的Properties屬性集合中獲取路由數(shù)據(jù)對象。

在SelfHost的環(huán)境下這是獲取不到的,為啥?因為上面以及之前的篇幅中在管道的處理中沒有提到過處理路由并且生成路由數(shù)據(jù)的。所以這個時候會根據(jù)HttpConfiguration中的HttpRouteCollection類型的屬性Routes,Routes屬性再根據(jù)SendAsync()方法的參數(shù)類型為HttpRequestMessage的request信息獲取路由數(shù)據(jù)對象IHttpRouteData

在匹配成功獲取到路由數(shù)據(jù)對象(IHttpRouteData)之后便會添加至HttpRequestMessage對象實例(request)的Properties屬性集合中。

之前對于路由的了解,最后的執(zhí)行的Handler都是起初定義在路由對象中的,而在實際情況中,我們注冊路由的時候并沒有,假使這種情況就在現(xiàn)在發(fā)生,可以看到routeData.Route.Hander==null這個是成立的,所以執(zhí)行的是我們先前說過的在構(gòu)造函數(shù)中的HttpControllerDispatcher類型的實例的SendAsync()方法(實際當(dāng)中HttpControllerDispatcher類型被HttpMessageInvoker類型所封裝)。

 

而HttpControllerDispatcher類型就跟Web API控制器有關(guān)了,這里就不提前說了,后面一定會講到。

網(wǎng)站標(biāo)題:ASP.NETWebAPISelfhost宿主環(huán)境中管道、路由
本文URL:http://www.chinadenli.net/article28/piiscp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司網(wǎng)頁設(shè)計公司響應(yīng)式網(wǎng)站定制網(wǎng)站App開發(fā)品牌網(wǎng)站設(shè)計

廣告

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

h5響應(yīng)式網(wǎng)站建設(shè)