.NET Core开发日志——RequestDelegate
本文主要是對.NET Core開發日志——Middleware的補遺,但是會從看起來平平無奇的RequestDelegate開始敘述,所以以其作為標題,也是合情合理。
RequestDelegate是一種委托類型,其全貌為public delegate Task RequestDelegate(HttpContext context),MSDN上對它的解釋,"A function that can process an HTTP request."——處理HTTP請求的函數。唯一參數,是最熟悉不過的HttpContext,返回值則是表示請求處理完成的異步操作類型。
可以將其理解為ASP.NET Core中對一切HTTP請求處理的抽象(委托類型本身可視為函數模板,其實現具有統一的參數列表及返回值類型),沒有它整個框架就失去了對HTTP請求的處理能力。
并且它也是構成Middleware的基石。或者更準確地說參數與返回值都是其的Func<RequestDelegate, RequestDelegate>委托類型正是維持Middleware運轉的核心齒輪。
組裝齒輪的地方位于ApplicationBuilder類之內,其中包含著所有齒輪的集合。
private readonly IList<Func<RequestDelegate, RequestDelegate>> _components = new List<Func<RequestDelegate, RequestDelegate>>();以及添加齒輪的方法:
在Startup類的Configure方法里調用以上ApplicationBuilder的Use方法,就可以完成一個最簡單的Middleware。
齒輪要想變成Middleware,在完成添加后,還需要經過組裝。
Build方法里先定義了最底層的零件——app,context => {?
context.Response.StatusCode = 404;?
return Task.CompletedTask; },
這段代碼意味著,如果沒有添加任何Middleware的話,ASP.NET Core站點啟動后,會直接出現404的錯誤。
接下的一段,遍歷倒序排列的齒輪,開始正式組裝。
在上述例子里,只使用了一個齒輪:
那么第一次也是最后一次循環后,執行component(app)操作,app被重新賦值為:
context => context.Response.WriteAsync("Hello, World!");組裝的結果便是app的值。
這個組裝過程在WebHost進行BuildApplication時開始操作。從此方法的返回值類型可以看出,雖然明義上是創建Application,其實生成的是RequestDelegate。
而這個RequestDelegate最終會在HostingApplication類的ProcessRequestAsync方法里被調用。
上例中的執行結果即是顯示Hello, World!字符。
404的錯誤不再出現,意味著這種Middleware只會完成自己對HTTP請求的處理,并不會將請求傳至下一層的Middleware。
要想達成不斷傳遞請求的目的,需要使用另一種Use擴展方法。
在實際代碼中可以這么寫:
現在多了個Middleware,繼續上面的組裝過程。app的值最終被賦值為:
顯示結果為:
I am a Middleware! Hello, World!下面的流程圖中可以清楚地說明這個過程。
如果把await next.Invoke()注釋掉的話,
上例中第一個Middleware處理完后,不會繼續交給第二個Middleware處理。注意以下simpleNext的方法只被定義而沒有被調用。
這種情況被稱為短路(short-circuiting)。
做短路處理的Middleware一般會放在所有Middleware的最后,以作為整個pipeline的終點。
并且更常見的方式是用Run擴展方法。
所以可以把上面例子的代碼改成下面的形式:
除了短路之外,Middleware處理時還可以有分支的情況。
URL地址后面跟著branch1時:
URL地址后面跟著branch2時:
其它情況下:
Map擴展方法的代碼實現:
創建分支的辦法就是重新實例化一個ApplicationBuilder。
public IApplicationBuilder New(){ ?? ? ?return new ApplicationBuilder(this); }
對分支的處理則是封裝在MapMiddleware類之中。
說到MapMiddleware,不得不提及各種以Use開頭的擴展方法,比如UseStaticFiles,UseMvc,UsePathBase等等。
這些方法內部都會調用UseMiddleware方法以使用各類定制的Middleware類。如下面UsePathBase的代碼:
而從UseMiddleware方法中可以獲知,Middleware類需滿足兩者條件之一才能被有效使用。其一是實現IMiddleware,其二,必須有Invoke或者InvokeAsync方法,且方法至少要有一個HttpContext類型參數(它還只能是放第一個),同時返回值需要是Task類型。
對ASP.NET Core中Middleware的介紹到此終于可以告一段落,希望這兩篇文章能夠為讀者提供些許助力。
原文地址:https://www.cnblogs.com/kenwoo/p/9404671.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的.NET Core开发日志——RequestDelegate的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中字段、属性、只读、构造函数赋值、反
- 下一篇: .NetCore SkyWalking