IApplicationBuilder 是應(yīng)用大家最熟悉它的地方應(yīng)該就是位于 Startup.cs 文件中的 Configure 方法了吧
十余年的松滋網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整松滋建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“松滋網(wǎng)站設(shè)計(jì)”,“松滋網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory){ app.UseDeveloperExceptionPage(); app.UseStaticFiles(); app.UseMvc(); }
IApplicationBuilder 就像其名字一樣,其實(shí)很簡(jiǎn)單,就是對(duì)內(nèi)做了一個(gè)接口封裝,對(duì)外提供了一個(gè)擴(kuò)展,具體來說就是
對(duì)內(nèi)封裝了
IServiceProvider ApplicationServices { get; set; }:應(yīng)用程序使用的服務(wù),就是ConfigureServices注入的那些。
IFeatureCollection ServerFeatures { get; }: 工具箱對(duì)象,下面會(huì)提到的。
IDictionary<string, object> Properties { get; } :橫跨各個(gè)中間件,在他們之間共享數(shù)據(jù)。
對(duì)外擴(kuò)展了
IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware):注冊(cè)中間件
還有一個(gè) Build 用來返回管道最終的 HttpContext 狀態(tài)
RequestDelegate Build(); : 最終的 RequestDelegate 形態(tài)
沒什么復(fù)雜的東西,就這幾個(gè)東西需要了解,下面是一個(gè) IApplicationBuilder 的貼圖,看起來應(yīng)該會(huì)更直觀。
那 RequestDelegate 又是什么東西呢?
RequestDelegate
RequestDelegate 是一個(gè)委托,是以委托形式對(duì) HttpContext 的封裝,在 ASP.NET Core 中也是非常重要的一個(gè)對(duì)象,先看一下定義吧。
namespace Microsoft.AspNetCore.Http{ public delegate Task RequestDelegate(HttpContext context); }
為什么說這個(gè)對(duì)象很重要呢,因?yàn)樵诠艿乐兴械闹虚g件都是直接或者間接的使用到它來做一些功能,因?yàn)樗b這 HttpContext 的嘛,而在Web開發(fā)中 HttpContext 的地位又是如此的高,接下來就說說 HttpContext。
HttpContext 應(yīng)該是做Web開發(fā)最熟悉的一個(gè)對(duì)象了,在這個(gè)對(duì)象中,封裝著Http整個(gè)管道中的關(guān)鍵對(duì)象信息,這個(gè)對(duì)象同時(shí)伴隨著整個(gè)管道中傳輸,也就是會(huì)經(jīng)歷整個(gè)請(qǐng)求的生命周期,所以這個(gè)對(duì)象非常重要,也是學(xué)習(xí)Web開發(fā)的一個(gè)基礎(chǔ)知識(shí)。
與傳統(tǒng) .NET Framework 中的 System.Web.HttpContext 不同的是,在 ASP.NET Core 中 HttpContext 是一個(gè)抽象類,位于 Microsoft.AspNetCore.Http 命名空間下。它有一個(gè)默認(rèn)的實(shí)現(xiàn)叫 DefaultHttpContext位于 Microsoft.AspNetCore.Http 程序集。
我們知道以前的 System.Web.HttpContext 是怎么創(chuàng)建的吧?
在傳統(tǒng)ASP.NET程序中,IIS接收到請(qǐng)求之后,會(huì)交給 aspnet_isapi.dll 這個(gè)程序集,程序集啟動(dòng) ASP.NET 運(yùn)行環(huán)境,然后調(diào)用 ISAPIRuntime 進(jìn)行封裝,封裝之后就是一個(gè) HttpWorkRequest 對(duì)象了,然后由 HttpRuntime將其轉(zhuǎn)化為一個(gè)HttpContext。
所以在System.Web.HttpContext中,其構(gòu)造函數(shù)為 HttpWorkerRequest
namespace System.Web { public sealed class HttpContext : IServiceProvider, IPrincipalContainer { public HttpContext(HttpWorkerRequest wr); } }
也就是說其實(shí)構(gòu)建HttpContext所有的信息都是來自于 IIS 傳遞下來的 HttpWorkerRequest。
現(xiàn)在,忘了它吧,是的全部忘掉,這個(gè)時(shí)候你又要罵微軟了,尼瑪當(dāng)年為了面試這個(gè)東西不知道背了多少遍。 =_=
沒辦法,時(shí)代要發(fā)展要進(jìn)步,我們也需要不斷的學(xué)習(xí),那在 ASP.NET Core 中,沒有了 IIS ,它的 HttpContext 又是如何生成的呢? 構(gòu)建 HttpContext 所需的信息又怎么來的呢? 客官不要著急,聽我慢慢分解
IFeatureCollection
這里就需要先說一下另外一個(gè)比較重要接口了,它就是 IFeatureCollection 接口,這個(gè)接口是干嘛的呢? 我們先看一下它的定義:
public interface IFeatureCollection : IEnumerable<KeyValuePair<Type, object>> { bool IsReadOnly { get; } int Revision { get; } object this[Type key] { get; set; } TFeature Get<TFeature>(); void Set<TFeature>(TFeature instance); }
看到這個(gè)接口的定義應(yīng)該能夠明白其功能了,接口繼承于IEnumerable<KeyValuePair<Type, object>> 說明接口是一個(gè)鍵值對(duì)的集合,我們給接口取個(gè)名字吧,叫“工具箱”。
有些同學(xué)應(yīng)該猜出來了,是的,ASP.NET Core中構(gòu)建 HttpContext 就是所有需要的組件都是來自于 工具箱,那么 工具箱 里面都有什么呢?可以看到工具箱里面有 IHttpRequestFeature, IHttpResponseFeature, ISessionFeature 等等還有很多就不一一列舉了,正是由于這一個(gè)一個(gè)的工具箱里面的工具,最終構(gòu)建成為了整個(gè) HttpContext 對(duì)象。我們來看一下 HttpContext 對(duì)象的構(gòu)造函數(shù):
namespace Microsoft.AspNetCore.Http{ public class DefaultHttpContext : HttpContext { public DefaultHttpContext(IFeatureCollection features) { Initialize(features); } } }
沒錯(cuò)吧,有同學(xué)可能要問了,工具箱里面的這些工具什么時(shí)候初始化的呢? 先別急,我們先看看我們熟悉的 Request 和 Response。
HttpRequest
同樣在 ASP.NET Core ,HttpRequest 也成為了一個(gè)抽象類,它的默認(rèn)實(shí)現(xiàn)叫 DefaultHttpRequest,主要是封裝瀏覽器對(duì)服務(wù)器的請(qǐng)求的各種數(shù)據(jù),包括瀏覽器請(qǐng)求的網(wǎng)址,查詢字符串?dāng)?shù)據(jù)或表單數(shù)據(jù)等等...
不一一詳細(xì)介紹了,都是很簡(jiǎn)單的內(nèi)容。
HttpResponse
HttpResponse 也成為了一個(gè)抽象類,它的默認(rèn)實(shí)現(xiàn)叫 DefaultHttpResponse,主要是是服務(wù)器接收到瀏覽器的請(qǐng)求后,處理返回結(jié)果常用的一個(gè)對(duì)象。
是時(shí)候該解釋一下上面的 工具箱 初始化的問題了,我想我用一個(gè)圖來直接說明管道中的請(qǐng)求再合適不過了,下面就是一個(gè) ASP.NET Core 整個(gè)服務(wù)端構(gòu)建管道一個(gè)流程圖:
從圖中可以看到,RequestDelegate 攜帶著 HttpContext 一路經(jīng)過各種 Server、Hosting 等,最終到達(dá)了由 IApplicationBuilder 構(gòu)建出來的 Application pipeline 這一管道區(qū)域,然后再經(jīng)過各種中間件處理,最終構(gòu)建出來了我們的 Response,而我們的工具箱 也正是在這個(gè)過程中變得 “ 飽滿 ” 起來。
有一個(gè)需要知道的知識(shí)點(diǎn)就是,中間件是怎么樣添加或者叫注冊(cè)到管道中的呢? 又是如何被應(yīng)用起來的呢?
上面的圖可以看到,橙色區(qū)域的 Application pipeline 是由 IApplicationBuilder 構(gòu)建起來的。也就是說我們可以在 IApplicationBuilder 做點(diǎn)什么東西來添加我們的中間件。 是的 IApplicationBuilder 暴露出來了一個(gè) IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware); 方法來讓我們注冊(cè)中間件,也就是說位于 Startup.cs 文件中的 Configure 方法。
那么又是怎么樣應(yīng)用起來的呢? IApplicationBuilder 在 Hosting 中有一個(gè) IApplicationBuilderFactory 的對(duì)象,Hosting 通過這個(gè)Factory 創(chuàng)建之后就會(huì)傳遞到了 HostingApplication 對(duì)象中,最后由 IWebHost 對(duì)象調(diào)用 IServer 對(duì)象的Start 同時(shí)把 HostingApplication傳遞進(jìn)去來最終啟動(dòng)服務(wù)端??梢詫?duì)照上面的圖理解一下。
網(wǎng)站欄目:ASP.NETCoreHTTP管道中的那些事兒
網(wǎng)頁網(wǎng)址:http://chinadenli.net/article2/giioic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、網(wǎng)頁設(shè)計(jì)公司、小程序開發(fā)、面包屑導(dǎo)航、網(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)