ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
從《ASP.NET Core管道深度剖析(1):采用管道處理HTTP請(qǐng)求》我們知道ASP.NET Core請(qǐng)求處理管道由一個(gè)服務(wù)器和一組有序的中間件組成,所以從總體設(shè)計(jì)來(lái)講是非常簡(jiǎn)單的,但是就具體的實(shí)現(xiàn)來(lái)說(shuō),由于其中涉及很多對(duì)象的交互,我想很少人能夠地把它弄清楚。如果想非常深刻地認(rèn)識(shí)ASP.NET Core的請(qǐng)求處理管道,可以分兩個(gè)步驟來(lái)進(jìn)行,我們首先可以在忽略細(xì)節(jié)的前提下搞清楚管道處理HTTP請(qǐng)求的總體流程,然后再此基礎(chǔ)上補(bǔ)充之前遺漏的細(xì)節(jié)。為了讓讀者朋友們能夠更加容易地理解管道處理HTTP請(qǐng)求的總體流程,我們根據(jù)真實(shí)管道的實(shí)現(xiàn)原理再造了一個(gè)“模擬管道”。[模擬管道以及建立在它之上的圖片發(fā)布應(yīng)用源代碼從這里下載]
對(duì)于我們?cè)僭斓拿阅惆姹镜墓艿?#xff0c;它不僅僅體現(xiàn)了真實(shí)管道中處理HTTP請(qǐng)求的流程,對(duì)于其中涉及的接口和類型,我們基本上采用了相同的命名。但是為了避免很多“細(xì)枝末節(jié)”對(duì)我們的理解造成干擾,我們會(huì)進(jìn)行最大限度的裁剪。對(duì)于大部分方法,我們只會(huì)保留最核心的邏輯;對(duì)于一些接口,我們?cè)O(shè)置會(huì)提出掉一些與核心流程無(wú)關(guān)的成員。在通過(guò)這個(gè)模擬的管道講解HTTP請(qǐng)求的總體處理流程之前,我們先來(lái)看看如何在它基礎(chǔ)上開(kāi)發(fā)一個(gè)簡(jiǎn)單的應(yīng)用。
我們?cè)谶@個(gè)模擬管道上開(kāi)發(fā)一個(gè)簡(jiǎn)單的應(yīng)用來(lái)發(fā)布圖片。具體的應(yīng)用場(chǎng)景是這樣:我們將圖片文件保存在服務(wù)器上的某個(gè)目錄下,客戶端可以通過(guò)發(fā)送HTTP請(qǐng)求并在請(qǐng)求地址上指定文件名的方式來(lái)獲取目標(biāo)圖片。如右圖所示,我們利用瀏覽器向針對(duì)某張圖片的地址(“http://localhost:3721/girl”)發(fā)送請(qǐng)求后,獲取到的目標(biāo)圖片(girl.jpg)會(huì)直接顯示到瀏覽器上。
由于我們模擬的管道采用與真實(shí)管道一致的API,所以兩種采用的編程模式也是一致的。對(duì)于這個(gè)用于發(fā)布圖片的應(yīng)用來(lái)說(shuō),它也和我們上面演示的Hello World程序一樣有兩個(gè)基本的類型構(gòu)成。一個(gè)是定義了入口Main方法的Program,另一個(gè)則是作為啟動(dòng)類型的Startup。
1: class Program 2: { 3: static void Main(string[] args) 4: { 5: new WebHostBuilder() 6: .UseServer(new HttpListenerServerFactory("http://localhost:3721/")) 7: .UseStartup(typeof(Startup)) 8: .Build() 9: .Start(); 10: } 11: } 12:? 13: public class Startup 14: { 15: public void Configure(IApplicationBuilder app) 16: { 17: app.UseImages(@"c:\images"); 18: } 19: }如上面的代碼片斷所示,我們?cè)贛ain方法中創(chuàng)建了一個(gè)WebHostBuilder對(duì)象,在調(diào)用其Build方法創(chuàng)建應(yīng)用宿主的WebHost之前,我們調(diào)用其UseServer方法注冊(cè)了一個(gè)用于創(chuàng)建服務(wù)器的HttpListenerServerFactory對(duì)象。HttpListenerServerFactory對(duì)象用于創(chuàng)建一個(gè)名為HttpListenerServer的服務(wù)器,這是我們自己定義的服務(wù)器,它利用一個(gè)HttpListener對(duì)象實(shí)現(xiàn)了針對(duì)HTTP請(qǐng)求的監(jiān)聽(tīng)、接收和最終的響應(yīng)。HttpListenerServerFactory構(gòu)造函數(shù)指定的HttpListener的監(jiān)聽(tīng)地址。
在完成了服務(wù)器注冊(cè)之后,我們調(diào)用UseStartup方法將Startup作為啟動(dòng)類型。通過(guò)上面的介紹我們知道,啟動(dòng)類型的目的在于通過(guò)注冊(cè)相應(yīng)中間件的方式對(duì)構(gòu)建的管道進(jìn)行定制。對(duì)于我們演示的這個(gè)應(yīng)用來(lái)說(shuō),管道對(duì)HTTP請(qǐng)求的處理體現(xiàn)在如何根據(jù)請(qǐng)求地址解析出對(duì)應(yīng)圖片的文件路徑,并將文件的內(nèi)容作為請(qǐng)求的響應(yīng)。完成這項(xiàng)操作的中間件是通過(guò)調(diào)用我們自定義的擴(kuò)展方法UseImages進(jìn)行注冊(cè)的,該方法的參數(shù)表示存放圖片的目錄(c:\images)。
總的來(lái)說(shuō),請(qǐng)求處理管道涉及到四個(gè)核心的對(duì)象,它們分別是WebHostBuilder、WebHost、Server和HttpApplication,它們之間具有如右圖所示的關(guān)系。我們通過(guò)WebHostBuilder來(lái)創(chuàng)建WebHost,并領(lǐng)用后者來(lái)構(gòu)建請(qǐng)求處理管道。 請(qǐng)求處理管道通過(guò)一個(gè)Server和一個(gè)HttpApplication對(duì)象組成,后者是對(duì)所有注冊(cè)的中間件的封裝。當(dāng)WebHost被啟動(dòng)的時(shí)候,它會(huì)創(chuàng)建Server和HttpApplication對(duì)象,并將后者作為參數(shù)調(diào)用Server的Start方法以啟動(dòng)服務(wù)器。啟動(dòng)后的Server開(kāi)啟監(jiān)聽(tīng)請(qǐng)求并利用HttpApplication來(lái)處理接收到請(qǐng)求。當(dāng)HttpApplication完成了所有請(qǐng)求處理工作之后,它會(huì)利用Server完成對(duì)請(qǐng)求的最終響應(yīng)。
我們將在后續(xù)的兩篇文章對(duì)模擬管道的設(shè)計(jì)和實(shí)現(xiàn)作詳細(xì)介紹,相信讀者朋友們據(jù)此可以對(duì)實(shí)現(xiàn)在ASP.NET Core管道中的請(qǐng)求處理流程以及管道自身的創(chuàng)建流程有一個(gè)深刻的認(rèn)識(shí),如果大家對(duì)此有興趣,敬請(qǐng)關(guān)注本系列后續(xù)文章。
一、采用管道處理HTTP請(qǐng)求
二、創(chuàng)建一個(gè)“迷你版”的管道來(lái)模擬真實(shí)管道請(qǐng)求處理流程
三、管道如何處理HTTP請(qǐng)求的
四、管道是如何被創(chuàng)建出來(lái)的
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 卖8499元的索尼旗舰 竟然与魅族合体?
- 下一篇: [你必须知道的.NET]第十四回:认识I