IApplicationBuilder 是應(yīng)用大家最熟悉它的地方應(yīng)該就是位于 Startup.cs 文件中的 Configure 方法了吧
目前創(chuàng)新互聯(lián)建站已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、白山網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory){ app.UseDeveloperExceptionPage(); app.UseStaticFiles(); app.UseMvc(); }
IApplicationBuilder 就像其名字一樣,其實(shí)很簡單,就是對(duì)內(nèi)做了一個(gè)接口封裝,對(duì)外提供了一個(gè)擴(kuò)展,具體來說就是
對(duì)內(nèi)封裝了
IServiceProvider ApplicationServices { get; set; }:應(yīng)用程序使用的服務(wù),就是ConfigureServices注入的那些。
IFeatureCollection ServerFeatures { get; }: 工具箱對(duì)象,下面會(huì)提到的。
IDictionary
對(duì)外擴(kuò)展了
IApplicationBuilder Use(Func
還有一個(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> { bool IsReadOnly { get; } int Revision { get; } object this[Type key] { get; set; } TFeature Get (); void Set (TFeature instance); }
看到這個(gè)接口的定義應(yīng)該能夠明白其功能了,接口繼承于IEnumerable
有些同學(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ì)介紹了,都是很簡單的內(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
那么又是怎么樣應(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ì)照上面的圖理解一下。
創(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ù)器買多久送多久。