日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core开发日志——RequestDelegate

發布時間:2023/12/4 asp.net 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。