bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

ASP.NETCoreHTTP管道中的那些事兒-創(chuàng)新互聯(lián)

IApplicationBuilder

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í)很簡單,就是對內(nèi)做了一個(gè)接口封裝,對外提供了一個(gè)擴(kuò)展,具體來說就是

對內(nèi)封裝了

  • IServiceProvider ApplicationServices { get; set; }:應(yīng)用程序使用的服務(wù),就是ConfigureServices注入的那些。

  • IFeatureCollection ServerFeatures { get; }: 工具箱對象,下面會(huì)提到的。

  • IDictionary<string, object> Properties { get; } :橫跨各個(gè)中間件,在他們之間共享數(shù)據(jù)。

對外擴(kuò)展了

  • IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware):注冊中間件

還有一個(gè) Build 用來返回管道最終的 HttpContext 狀態(tài)

  • RequestDelegate Build(); : 最終的 RequestDelegate 形態(tài)

沒什么復(fù)雜的東西,就這幾個(gè)東西需要了解,下面是一個(gè) IApplicationBuilder 的貼圖,看起來應(yīng)該會(huì)更直觀。

ASP.NET Core HTTP 管道中的那些事兒

那 RequestDelegate 又是什么東西呢?

RequestDelegate

RequestDelegate 是一個(gè)委托,是以委托形式對 HttpContext 的封裝,在 ASP.NET Core 中也是非常重要的一個(gè)對象,先看一下定義吧。

namespace Microsoft.AspNetCore.Http{    public delegate Task RequestDelegate(HttpContext context);
}

為什么說這個(gè)對象很重要呢,因?yàn)樵诠艿乐兴械闹虚g件都是直接或者間接的使用到它來做一些功能,因?yàn)樗b這 HttpContext 的嘛,而在Web開發(fā)中 HttpContext 的地位又是如此的高,接下來就說說 HttpContext。

HttpContext

HttpContext 應(yīng)該是做Web開發(fā)最熟悉的一個(gè)對象了,在這個(gè)對象中,封裝著Http整個(gè)管道中的關(guān)鍵對象信息,這個(gè)對象同時(shí)伴隨著整個(gè)管道中傳輸,也就是會(huì)經(jīng)歷整個(gè)請求的生命周期,所以這個(gè)對象非常重要,也是學(xué)習(xí)Web開發(fā)的一個(gè)基礎(chǔ)知識。

與傳統(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接收到請求之后,會(huì)交給 aspnet_isapi.dll 這個(gè)程序集,程序集啟動(dòng) ASP.NET 運(yùn)行環(huán)境,然后調(diào)用 ISAPIRuntime 進(jìn)行封裝,封裝之后就是一個(gè) HttpWorkRequest 對象了,然后由 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è)鍵值對的集合,我們給接口取個(gè)名字吧,叫“工具箱”。

有些同學(xué)應(yīng)該猜出來了,是的,ASP.NET Core中構(gòu)建 HttpContext 就是所有需要的組件都是來自于 工具箱,那么 工具箱 里面都有什么呢?可以看到工具箱里面有 IHttpRequestFeature, IHttpResponseFeature, ISessionFeature 等等還有很多就不一一列舉了,正是由于這一個(gè)一個(gè)的工具箱里面的工具,最終構(gòu)建成為了整個(gè) HttpContext 對象。我們來看一下 HttpContext 對象的構(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,主要是封裝瀏覽器對服務(wù)器的請求的各種數(shù)據(jù),包括瀏覽器請求的網(wǎng)址,查詢字符串?dāng)?shù)據(jù)或表單數(shù)據(jù)等等...

ASP.NET Core HTTP 管道中的那些事兒

不一一詳細(xì)介紹了,都是很簡單的內(nèi)容。

HttpResponse

HttpResponse 也成為了一個(gè)抽象類,它的默認(rèn)實(shí)現(xiàn)叫 DefaultHttpResponse,主要是是服務(wù)器接收到瀏覽器的請求后,處理返回結(jié)果常用的一個(gè)對象。

ASP.NET Core HTTP 管道中的那些事兒

ASP.NET Core 管道

是時(shí)候該解釋一下上面的 工具箱 初始化的問題了,我想我用一個(gè)圖來直接說明管道中的請求再合適不過了,下面就是一個(gè) ASP.NET Core 整個(gè)服務(wù)端構(gòu)建管道一個(gè)流程圖:

ASP.NET Core HTTP 管道中的那些事兒

從圖中可以看到,RequestDelegate 攜帶著 HttpContext 一路經(jīng)過各種 Server、Hosting 等,最終到達(dá)了由 IApplicationBuilder 構(gòu)建出來的 Application pipeline 這一管道區(qū)域,然后再經(jīng)過各種中間件處理,最終構(gòu)建出來了我們的 Response,而我們的工具箱 也正是在這個(gè)過程中變得 “ 飽滿 ” 起來。

有一個(gè)需要知道的知識點(diǎn)就是,中間件是怎么樣添加或者叫注冊到管道中的呢? 又是如何被應(yīng)用起來的呢?

上面的圖可以看到,橙色區(qū)域的 Application pipeline 是由 IApplicationBuilder 構(gòu)建起來的。也就是說我們可以在 IApplicationBuilder 做點(diǎn)什么東西來添加我們的中間件。 是的 IApplicationBuilder 暴露出來了一個(gè) IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware); 方法來讓我們注冊中間件,也就是說位于 Startup.cs 文件中的 Configure 方法。

那么又是怎么樣應(yīng)用起來的呢? IApplicationBuilder 在 Hosting 中有一個(gè) IApplicationBuilderFactory 的對象,Hosting 通過這個(gè)Factory 創(chuàng)建之后就會(huì)傳遞到了 HostingApplication 對象中,最后由 IWebHost 對象調(diào)用 IServer 對象的Start 同時(shí)把 HostingApplication傳遞進(jìn)去來最終啟動(dòng)服務(wù)端。可以對照上面的圖理解一下。

創(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級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

網(wǎng)頁名稱:ASP.NETCoreHTTP管道中的那些事兒-創(chuàng)新互聯(lián)
文章位置:http://vcdvsql.cn/article10/cssido.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)網(wǎng)站營銷定制網(wǎng)站外貿(mào)建站移動(dòng)網(wǎng)站建設(shè)外貿(mào)網(wǎng)站建設(shè)

廣告

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

網(wǎng)站托管運(yùn)營