日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時(shí)間:2023/12/4 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core HTTP 管道中的那些事儿 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

馬上2016年就要過去了,時(shí)間可是真快啊。

上次寫完 Identity 系列之后,反響還不錯(cuò),所以本來打算寫一個(gè) ASP.NET Core 中間件系列的,但是中間遇到了很多事情。首先是 NPOI 的移植工作,移植過后還有一些Bug需要修復(fù),然后一個(gè)事情是一個(gè)有關(guān)于分布式架構(gòu)中消息一致性的一個(gè)中間件設(shè)計(jì)開發(fā)工作,還有就是博客還要堅(jiān)持寫,最后就是還有好幾本書需要讀,以及消化學(xué)習(xí),所以深深感覺到時(shí)間不夠用。廢話不多說了,進(jìn)入主題。

大部分中間件都是要依賴于 HTTP 管道和 HttpAbstractions 提供的上下文的,所以有必要先介紹一下 ASP.NET Core 在管道中封裝了什么,了解清楚之后有助于更高的進(jìn)階學(xué)習(xí)。你看不懂也沒有關(guān)系,對(duì)這些概念有一個(gè)認(rèn)識(shí)就可以了,不需要你精通每一步都具體做了哪些東西,達(dá)到會(huì)用就是我的目的。因?yàn)槲矣X得隨著你以后開發(fā)的深入,對(duì)這些東西使用多了之后,自然會(huì)想了解更多,到那個(gè)時(shí)候,你就會(huì)去看源碼了。

IApplicationBuilder

IApplicationBuilder?是應(yīng)用大家最熟悉它的地方應(yīng)該就是位于 Startup.cs 文件中的 Configure 方法了吧

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<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

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ì)介紹了,都是很簡單的內(nèi)容。

HttpResponse

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

ASP.NET Core 管道

是時(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ì)照上面的圖理解一下。

總結(jié)

在本篇中,我們知道了 ASP.NET Core Http 管道中的幾個(gè)對(duì)象,他們分別是?IApplicationBuilder?,?RequestDelegate?,?HttpContext?,?HttpRequest?,?HttpResponse,IFeatureCollection?等,然后也知道了他們之間的關(guān)系,接著我們通過一個(gè)管道流程圖知道了他們的調(diào)用關(guān)系,也知道了如何向管道中注冊(cè)中間件。

原文地址: http://www.cnblogs.com/savorboard/p/aspnetcore-http-pipeline.html


.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注

總結(jié)

以上是生活随笔為你收集整理的ASP.NET Core HTTP 管道中的那些事儿的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。