從上面的內(nèi)容我們知道ASP.NET Core請(qǐng)求處理管道由一個(gè)服務(wù)器和一組中間件構(gòu)成,所以從總體設(shè)計(jì)來(lái)講是非常簡(jiǎn)單的。但是就具體的實(shí)現(xiàn)來(lái)說(shuō),由于其中涉及很多對(duì)象的交互,很少人能夠地把它弄清楚。如果想非常深刻地認(rèn)識(shí)ASP.NET Core的請(qǐng)求處理管道,我覺(jué)得可以分兩個(gè)步驟來(lái)進(jìn)行:首先,我們可以在忽略具體細(xì)節(jié)的前提下搞清楚管道處理HTTP請(qǐng)求的總體流程;在對(duì)總體流程有了大致了解之后,我們?cè)賮?lái)補(bǔ)充這些刻意忽略的細(xì)節(jié)。為了讓讀者朋友們能夠更加容易地理解管道處理HTTP請(qǐng)求的總體流程,我們根據(jù)真實(shí)管道的實(shí)現(xiàn)原理再造了一個(gè)“迷你版的管道”。[本文已經(jīng)同步到《ASP.NET Core框架揭秘》之中] [源代碼從這里下載]

目錄
一、建立在“模擬管道”上的應(yīng)用
二、HttpApplication——一組中間件的有序集合
三、HttpContext——對(duì)當(dāng)前HTTP上下文的抽象
四、服務(wù)器——實(shí)現(xiàn)對(duì)請(qǐng)求的監(jiān)聽(tīng)、接收和響應(yīng)

一、建立在“模擬管道”上的應(yīng)用

再造的迷你管道不僅僅體現(xiàn)了真實(shí)管道中處理HTTP請(qǐng)求的流程,并且對(duì)于其中涉及的接口和類(lèi)型,我們也基本上采用了相同的命名方式。但是為了避免“細(xì)枝末節(jié)”造成的干擾,我會(huì)進(jìn)行最大限度的裁剪。對(duì)于大部分方法,我們只會(huì)保留最核心的邏輯。對(duì)于一些接口,我們會(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è)目錄下,客戶(hù)端可以通過(guò)發(fā)送HTTP請(qǐng)求并在請(qǐng)求地址上指定文件名的方式來(lái)獲取目標(biāo)圖片。如下圖所示,我們利用瀏覽器向針對(duì)某張圖片的地址(“http://localhost:3721/images/hello.png”)發(fā)送請(qǐng)求后,獲取到的目標(biāo)圖片(hello.png)會(huì)直接顯示到瀏覽器上。除此之外,如果指定的圖片地址沒(méi)有包含擴(kuò)展名(“.png”),我們的也會(huì)幫助我們自動(dòng)匹配一個(gè)文件名(不包含擴(kuò)展名)相同的圖片。

網(wǎng)友評(píng)論