這篇文章中,我們將一起學習在ASP.NET Core中配置中間件組件,以便處理請求處理管道,在閱讀這篇文章之前,麻煩大家先去看看,我前面寫的一篇文章:ASP.NET Core中間件組件,在這篇文章中,我們將一起學習下面幾個內容:
- 怎樣在ASP.NET Core中配置中間件組件?
- 什么是ASP.NET Core中的請求委托?
- 什么是ASP.NET Core中的Use和Run方法?
- 什么是UseDeveloperExceptionPage 中間件組件?
- 怎樣使用擴展方法Run,來配置中間件組件?
- 什么是擴展方法?
怎樣在ASP.NET Core中配置中間件組件
在前面的文章中,我們已經知道,我們需要在Startup類檔案中的Startup類中的Configure方法內,來配置中間件組件,我們打開之前創建的空模板的ASP.NET Core專案,可以看到專案默認有一個Configure方法:

什么是ASP.NET Core中的請求委托?
在ASP.NET Core中,請求委托被用來構建請求管道,也就是請求委托用來處理每一個即將從客戶端發來的請求,在ASP.NET Core中,你可以使用Run、Map、以及Use擴展方法來配置請求委托,你可以使用,匿名的行內方法,來指定一個請求委托(這叫做行內中間件),或者你可以使用一個可以重復使用的類,來指定請求委托,這些可以重用的類和行內的匿名方法被稱為中間件或者中間件組件,每一個請求處理管道中的中間件組件,就是用來觸發管道中的下一個組件,或者不觸發下一個中間件組件,這成為中間件短路,
什么是ASP.NET Core中的Use和Run方法?
在ASP.NET Core中,你可以使用“Use”和”Run”擴展方法,來注冊行內中間件組件到請求處理管道中,“Run”擴展方法允許我們添加終結中間件(終結中間件不會再去呼叫請求處理管道中的下一個中間件,)另外一方面,“Use”擴展方法添加的中間件,會去呼叫請求管道中的下一個中間件,
如果你去觀察Configure方法,你就會發現ASP.NET Core 是通過IApplicationBuilder介面的實體,和Use以及Run擴展方法一起,來配置的中間件組件,
- UseDeveloperExceptionPage() Middleware Component【UseDeveloperExceptionPage中間件組件】
- Middleware Component Registered using Run() method【中間件組件使用Run方法進行注冊】
我們來詳細討論一下這兩個中間件組件:
什么是UseDeveloperExceptionPage中間件組件?
正如你在Configure方法中看到的那樣,只有應用程式當前托管環境是“development”,這個UseDevelopExceptionPage中間件組件才會被注冊,并且只有在開發模式下,發生了未處理的例外,這個UseDevelopException中間件組件才會執行,你可以把這個看成是報錯直接顯示成黃頁的一個替換,在后面的文章中,我將會介紹使用這個UseDevelopExceptionPage中間件組件的專案例子,
怎樣使用Run擴展方法來配置中間件組件?
另外一個注冊中間件組件的方法就是使用Run擴展方法,只要使用了Run擴展方法注冊中間件組件,那么這個被注冊的中間件組件就稱為終結中間件組件,意味著:它將不會呼叫請求處理管道中的下一個中間件組件了,這個中間件組件也就將僅僅只是列印出“Hello World!”還有一點需要記住:這個中間件將會回應每一個即將來臨的HTTP請求,
第二個中間件組件是通過Run擴展方法注冊的,因為該組件是使用Run擴展方法注冊的,所以它將成為終結中間件,不會呼叫處理管道中的下一個中間件了,也就僅僅輸出“Hello World”,

我們通過IApplicationBuilder的實體(app),呼叫Run方法,來向請求處理管道中注冊中間件,下面是Run方法的定義:

正如你所看到的Run方法的定義,它是IApplicationBuilder介面的擴展方法,這也就是我們為啥能通過IAcclicationBuilder的實體app呼叫Run方法,如果你是第一次接觸擴展方法,請先去學一下擴展方法,
上面的圖片中,還可以發現,Run方法還有一個RequestDelegate委托的引數,下面是RequestDelegate委托的定義:

上面的圖片中,RequestDelagate委托,有一個HttpContext型別的引數context.如果你沒接觸過過委托,也請先去學習,
我們已經知道,我們能在ASP.NET Core中處理HTTP請求和回應,是因為HttpContext物件,
在我們的例子中,我們通過lambda運算式,使用一個匿名的方法,傳遞請求委托,并且將HTTPContext物件作為輸出引數傳遞給請求委托,如下圖:

請注意:除了使用匿名的方法來傳遞請求委托,你還可以在單獨的類中定義請求委托,并且在這里進行傳遞,這個我們后面會介紹的,
實體:
我們來討論一下,使用Run擴展方法,創建的中間件組件,看下面的代碼:

現在我們在Configure方法中,有了兩個中間件組件,如果你運行專案,就會得到下面的輸出結果:
Getting Response from 1st Middleware
這個輸出結果,是來自第一個中間件,原因是:當我們使用了Run擴展方法注冊中間件組件的時候,這個時候,這個中間件就稱為了終結中間件,也就是不會再去呼叫下一個中間件了,
那么你現在肯定有疑問了,那么怎么來呼叫下一個中間件呢?答案就是:

現在運行的話,就會看到兩個輸出結果了,
理解這個Use擴展方法
Use擴展方法將內嵌的中間件委托加到了請求處理管道中,下面是定義:

這個方法,同樣實作了IApplication介面,這也是你為啥可以使用IApplication實體呼叫這個方法了,正如你所看到的,這個Use方法有兩個引數,第一個引數就是HttpContext物件,第二個引數就是一個Func委托引數,也就是一個泛型委托,它可以處理請求,或者呼叫請求管道中的下一個中間件,
好了,上面的所有,就是今天要將的內容,大家明白了么?下一篇文章,我將帶領到家一起學習ASP.NET Core請求處理管道,在這篇文章中,我努力的解釋了,在ASP.NET Core中如何配置中間件組件,以便處理請求處理管道,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/47026.html
標籤:.NET Core
