日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求...

發(fā)布時間:2025/5/22 176 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

之所以稱ASP.NET Core是一個Web開發(fā)平臺,而不是一個單純的開發(fā)框架,源于它具有一個極具擴展性的請求處理管道,我們可以通過對這個管道的定制來滿足各種場景下的HTTP處理需求。ASP. NET Core應用的很多特性,比如路由、認證、會話、緩存等,都是通過對管道的定制來實現(xiàn)的。我們甚至可以通過管道定制在ASP.NET Core平臺上創(chuàng)建我們自己的Web框架,實際上MVC和SingalR這兩個重要的Web框架也是采用這樣的方式創(chuàng)建的。 [本文已經(jīng)同步到《ASP.NET Core框架揭秘》之中] [源代碼從這里下載]

目錄
一、從Hello World說起
二、管道的構(gòu)成
三、管道的定制

一、從Hello World說起

HTTP協(xié)議自身的特性決定了任何一個Web應用的工作方式都是監(jiān)聽、接收并處理HTTP請求,并在最終對請求予以響應,HTTP請求處理是管道式設(shè)計典型的應用場景。具體來說,我們根據(jù)具體的HTTP處理請求構(gòu)建一個管道,接收到的HTTP請求消息想水一樣流入這個管道,組成這個管道的各個環(huán)節(jié)依次對它作相應的處理。處理的結(jié)果同樣轉(zhuǎn)變成消息逆向流入這個管道進行處理,并最終轉(zhuǎn)變成回復給客戶端的HTTP響應。ASP.NET Core的消息處理管道從設(shè)計的角度來講是非常簡單的,但是從具體實現(xiàn)的角度則相對復雜并相對難以理解,為了讓讀者朋友們通過本章對此具有深刻的理解,我們從簡單的部分講起。

為了使讀者朋友們能夠以最直觀的感受認識ASP.NET Core的消息處理管道,我們來創(chuàng)建一個最簡單的Hello World程序。這是一個控制臺應用,整個程序由如下所示的五行代碼組成。當我們運行這個程序之后,一個名為KestrelServer的服務器將會啟動并綁定到本機上的5000端口進行請求監(jiān)聽。針對所有接收到的請求,我們都有會響應一個“Hello World”字符串。

1: public?class Program 2: { 3:???? public?static?void Main() 4:???? { 5:???????? new WebHostBuilder() 6:???????????? .UseKestrel() 7:???????????? .Configure(app => app.Run(async context=> await context.Response.WriteAsync("Hello World")))??????????? 8:???????????? .Build() 9:???????????? .Run(); 10:???? } 11: }

這個程序涉及到一個名為WebHost重要的對象, 它可以看成是Web應用的宿主,啟動Web應用本質(zhì)上就是啟動作為宿主的WebHost對象。WebHostBuilder是WebHost的創(chuàng)建者,我們調(diào)用它的Build方法創(chuàng)建相應的WebHost。當我們調(diào)用WebHost的擴展方法Run啟動應用的時候,用于監(jiān)聽、接收、處理和響應HTTP請求的管道隨之被建立。那么在這個過程中,通過調(diào)用Configure方法注冊到WebHostBuilder上的委托對象(委托類型為Action<IApplicationBuilder>)將用于管道的定制。總的來說,ASP.NET Core管道由WebHost在啟動的時候構(gòu)建,WebHostBuilder則是后者的創(chuàng)建者,下圖揭示了三者之間的關(guān)系。

?

二、管道的構(gòu)成

HTTP請求處理流程始于對請求的監(jiān)聽與接收,終于對請求的響應,這兩項工作均由同一個對象來完成,我們稱之為 “服務器(Server)” 。盡管ASP.NET Core的請求處理管道可以被自由地訂制,但是該管道必須有一個Server,Server是整個管道的 “龍頭” 。在上面的這個Hello World應用中,在調(diào)用WebHostBuilder的Build方法創(chuàng)建一個WebHost之前,我們調(diào)用了它的一個擴展方法UseKestrel,這個方法的作用就是為后續(xù)構(gòu)建的管道注冊一個名為KestrelServer的Server。

隨著WebHost的Start方法(當我們調(diào)用WebHost的擴展方法Run時,它的Start方法會自動被調(diào)用)的調(diào)用,定制的管道會被構(gòu)建出來,管道的服務器將會綁定到一個預設(shè)的端口(比如KestrelServer默認采用5000作為監(jiān)聽端口)開始監(jiān)聽請求。HTTP請求一旦抵達,Server會并將其標準并分發(fā)給管道后續(xù)的節(jié)點,我們將管道中位于服務器之后的節(jié)點稱為“中間件(Middleware)”。每個中間件都具有各自獨立的功能,比如我們有專門實現(xiàn)路由功能的中間件,有專門實施用戶認證的中間件。所謂的管道定制體現(xiàn)在根據(jù)具體的需求選擇對應的中間件組成最終處理請求的管道。下圖揭示了由一個服務器和一組中間件構(gòu)成的請求處理管道。

一個建立在ASP.NET Core之上的應用一般都是根據(jù)某個框架開發(fā)的,一般來說,開發(fā)框架本身就是通過某一個或者多個中間件構(gòu)建的。以ASP.NET Core MVC這個最著名的開發(fā)框架為例,它實際上是借助于一個叫做 “路由” 的中間件實現(xiàn)了請求地址與Controller/Action之間的映射,并在此基礎(chǔ)實現(xiàn)了激活Controller、執(zhí)行Action以及呈現(xiàn)View等一系列的功能。所以應用程序可以視為某個中間件的一部分,如果一定要將它獨立出來,整個請求處理管道將呈現(xiàn)出如下圖所示的結(jié)構(gòu)。

?

三、管道的定制

在演示的Hello World程序中,我們在調(diào)用擴展方法UseKestrel注冊KestrelServer服務器之后,還調(diào)用WebHostBuilder如下一個名為Configure的擴展方法注冊了一個類型為Action<IApplicationBuilder>的委托對象。從請求處理管道的角度來講,注冊這個委托對象的目的在于對構(gòu)建的管道進行定制,說得更加具體一點,我們利用這個類型為管道注冊需要的中間件。演示實例中注冊的這個委托對象調(diào)用ApplicationBuilder的擴展方法Run注冊了一個中間件來為每個請求響應一個 “Hello World” 字符串。

1: public?static IWebHostBuilder Configure(this IWebHostBuilder hostBuilder, Action<IApplicationBuilder> configureApp)

除了通過調(diào)用WebHostBuilder的Configure方法注冊一個Action<IApplicationBuilder>類型的委托,注冊中間定義管道的邏輯更多地還是定義在一個單獨的類型中。由于管道的定制總是在應用啟動(Startup)的時候進行,我們一般稱這個用于定制管道的類型為“啟動類型”,并在大部分情況下會直接命名為Startup。按照約定,通過注冊中間件定制管道的操作會實現(xiàn)在名為Configure的方法中,方法的第一個參數(shù)類型必須是IApplicationBuilder接口,后面可定義任意數(shù)量和類型的參數(shù),當這個方法被ASP.NET Core框架調(diào)用的時候,這些參數(shù)會采用依賴注入的方式來提供。啟動類型可以通過調(diào)用WebHostBuilder的擴展方法UseStartup<T>進行注冊,如下面的代碼與前面演示的實例是完全等效的。

1: public?class Program 2: { 3:???? public?static?void Main() 4:???? { 5:???????? new WebHostBuilder() 6:???????????? .UseKestrel() 7:???????????? .UseStartup<Startup>() 8:???????????? .Build() 9:???????????? .Run(); 10:???? } 11:???? public?class Startup 12:???? { 13:???????? public?void Configure(IApplicationBuilder app) 14:???????? { 15:???????????? app.Run(async context => await context.Response.WriteAsync("Hello World")); 16:???????? } 17:???? } 18: }

在真正的項目開發(fā)中,我們會利用ApplicationBuilder注冊相應的中間件進而構(gòu)建一個適合當前請求處理需求的管道。如下面的代碼片段所示,我們除了按照如上的方式調(diào)用擴展方法UseMvc注冊了支撐MVC框架的中間件(實際上是一個實現(xiàn)路由的中間件)之外,我們還通過調(diào)用其它的擴展方法注冊了相應的中間件實現(xiàn)了對靜態(tài)文件的訪問(UseStaticFiles)、錯誤頁面的呈現(xiàn)(UseExceptionHandler)以及基于ASP.NET Identity Framework的認證(UseIdentity)。

1: public?class Startup 2: { 3:???? public?void Configure(IApplicationBuilder app) 4:???? { 5:???????? app.UseExceptionHandler("/Home/Error"); 6:???????? app.UseStaticFiles(); 7:???????? app.UseIdentity();?????????? 8:? 9:???????? app.UseMvc(); 10:???? } 11: }

?


通過重建Hosting系統(tǒng)理解HTTP請求在ASP.NET Core管道中的處理流程[上]:采用管道處理請求
通過重建Hosting系統(tǒng)理解HTTP請求在ASP.NET Core管道中的處理流程[中]:管道如何處理請求
通過重建Hosting系統(tǒng)理解HTTP請求在ASP.NET Core管道中的處理流程[下]:管道如何創(chuàng)建

總結(jié)

以上是生活随笔為你收集整理的通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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