天天看點

Web APi之消息處理管道(五)前言

MVC有一套請求處理的機制,當然Web API也有自己的一套消息處理管道,該消息處理管道貫穿始終都是通過HttpMessageHandler來完成。我們知道請求資訊存在 RequestMessage 中,而響應資訊則存在 ResponseMessage 中,當請求資訊進入到管道中,此時HttpMessageHandler會對此進行相應的處理,當執行到控制器上的方法時此時就會進行響應,生成的響應資訊HttpResponseMessage就會逆向通過HttpMessageHandler依次進行處理最終傳回給用戶端。下面就請求管道中的對象進行詳細叙述。(若有不妥之處,請海涵)。

此類是所有管道進行中所有對象的基類,也就是說是最重要的一個類,下面我們借助.NET Reflector打開來看看該類的定義

Web APi之消息處理管道(五)前言

該類是一個抽象類并且其中最重要的兩個方法是 Dispose 和 SendAsyc ,對于Dispose方法的實作,我們檢視如下:

就是個非常标準的實作資源回收的方法,但是其并未實作某個資源的回收,下面會用到,先擱置在這裡。

經過如上描述,對于請求和響應都是通過HttpMessageHandler來實作,這就相當于是首尾相連,但是真正實作其相連的角色而是DelegatingHandler,并且該類并非僅僅是繼承,而且還進行了相應的一些擴充,下面我們來看看該類的定義:

Web APi之消息處理管道(五)前言

上述重要的兩個方法 Dispose 和 SendAsync 以及 InnerHandler 字段,下面我們一一來看這三者。

第一個是Dispose,上述已經講過在HttpMessageHandler中并未實作對資源的回收,從這裡我們可以看出它對其進行了重寫,說明可能是在其繼承類DelegatingHandler中進行了資源回收,隻是猜測,我們檢視其具體實作就明了了。如下:

很顯然,通過 this.innerHandler.Dispose(); 我們知道是實作了資源回收了的,那這個 InnerHandler 字段到底是幹嘛的了,看其傳回類型為HttpMessageHandler,說明是獲得了HttpMessageHandler對象的引用,接着就是重寫基類中的SendAsync方法,而調用此方法正是通過屬性InnerHandler來調用。我們說過InnerHandler是獲得對象HttpMessageHandler的引用說的更加明确就是下一個HttpMessageHandler處理程式的引用。

對于InnerHandler的實作連接配接下一個HttpMessageHandler似的委托鍊,類似如下:

上面我們已經講過除了位于末尾的處理程式是基于HttpMessageHandler外,其餘的都是基于DelegatingHandler。同時我們也講過在整個管道中由InnerHandler連接配接着下一個HttpMessageHandler,也就是InnerHandler處于整個管道的中間,但是管道頭和管道尾是哪個對象呢?管道頭就是我們接下來要講的HttpServer對象,既然該類也是處于整個管道中,則也繼承于DelegatingHandler,下面我們來看看該類的定義:

Web APi之消息處理管道(五)前言

 通過上述知HttpServer類确确實實繼承于DelegatingHandler中并且最重要的兩個屬性是 Configuration 和 Dispatcher ,同時這兩個屬性是隻讀的,通過檢視如下知:

HttpServer類中構造函數有幾個,當顯式指定了上述兩個屬性的值則會在相應的構造函數中進行初始化,但是如果未指定兩個屬性的值毫無疑問則會調用預設構造函數,此時則會建立一個HttpConfiguraion作為屬性Configuration的值,通過預設構造函數可得知,如下:

此時屬性Dispatcher的值則是一個 HttpRoutingDispatcher 對象,(該類為管道中的尾,下面會講)因為該屬性的傳回值為HttpMessageHandler而HttpRoutingDispatcher類繼承于HttpMessageHandler。當HttpServer被建立後,同時此時管道中的頭和尾就相繼被确定了下來。從在Web API的配置檔案中得知,一切配置都是基于HttpConfiguration,是以如果想在管道中自定義處理程式也就是繼承于DelegatingHandler,此時進行注冊該自定義處理程式當然也就得經過HttpConfiguration來實作。

上述也對該類做了一點鋪墊,此類為管道中的尾即管道中最後一個HttpMessageHandler,同時該類的對象是通過HttpSever即管道中的頭的構造函數而生成。此類的定義如下:

上述就大概介紹了Web API中整個消息管道中幾個重要對象:

管道頭(HttpServer)、管道中間(DelegatingHandler中的InnerHandler)、管道尾(HttpRoutingDispatcher)。
Web APi之消息處理管道(五)前言

繼續閱讀