ASP.NET Core實現自定義中間件的三種方式
一、什么是中間件
請求處理管道由一系列中間件組件組成。每個組件在 HttpContext 上執行操作,調用管道中的下一個中間件或終止請求。
詳情請看另外一篇文章:白話管道中間件
下圖是中間件的管道模型圖,有點類似過濾器。

二、中間件可以用來做什么?
在我們的應用程序當中和業務關系不大的一些需要在管道中做的事情可以使用,比如身份驗證,Session存儲,日志記錄,定時任務等。.NET自帶很多中間件,比如身份認證中間件UseAuthorization,Session中間件等。并且中間件可以自定義。
三、自定義中間件
當系統自帶的中間件不能滿足我們需求時,我們可以自定義中間件來實現功能,比如自己開發的定時任務等。注冊中間件的方式可以使用use和run,use可以快速注冊中間件,而run是終端中間件,是中間件管道末尾,當注冊該中間件后,后面的中間件將不再執行。下面介紹三種自定義中間件的方式。
1、自定義匿名中間件
自定義匿名中間件在Program.cs文件中就可以實現,可以通過use和run來自定義匿名中間件。案例如下:
app.Use(async (context, next) =>{Console.WriteLine("測試匿名中間件");await next();});//如果shi用app.run將在這里結束。
還可以通過useWhen創建子集中間件。如下代碼
//UseWhen有點類似if,這里是如果訪問/put或者/put/xxx會調用該中間件。app.UseWhen(context => context.Request.Path.StartsWithSegments("/put"), app =>{app.Use(async (context, next) =>{Console.WriteLine("測試UseWhen匿名中間件");await next();});});
使用注意:如果有下一個中間件,一定記得調用next(),否則會導致管道短路,后面的中間件不再被執行;如果有response操作不能調用next(),否則會報錯。
2、基于工廠的中間件
基于工廠中間件需要通過IMiddleware接口實現,然后在通過UseMiddleware注冊后在Program.cs文件中依賴注入。代碼如下:
//通過實現IMiddleware接口public class Middleware:IMiddleware{public async Task InvokeAsync(HttpContext context, RequestDelegate next){//下一個之前執行Console.WriteLine("測試基于工廠的中間件(歡迎公眾號:DOTNET開發跳槽)");await next(context);//下一個中間件處理完之后執行Console.WriteLine("基于工廠的中間件運行結束");}}public static class MiddlewareExtensions{public static IApplicationBuilder Middleware(this IApplicationBuilder builder){//需要注冊一下才能使用return builder.UseMiddleware<Middleware>();}}//在Program.cs中注冊和注入builder.Services.AddSingleton<Middleware>();app.Middleware();
3、基于約定中間件
主要通過RequestDelegate來實現管道傳遞,關鍵代碼如下。
public class TestMiddleware{public RequestDelegate _requestDelegate;public TestMiddleware(RequestDelegate requestDelegate){_requestDelegate = requestDelegate;}public async Task InvokeAsync(HttpContext context){//下一個之前執行Console.WriteLine("測試約定中間件開始,(歡迎公眾號:DOTNET開發跳槽)");await _requestDelegate(context);}}//在Program.cs中注冊app.UseMiddleware<TestMiddleware>();
執行效果如下:

結語
本文講述了自定義中間件的三種實現方式,自定義匿名中間件、基于工廠中間件和約定中間件。如果是比較小的功能,可以使用匿名中間件,比如過濾請求的鏈接;基于工廠中間件和約定中間件建議比較大的功能使用,從便利上來說推薦約定中間件。這是小編在使用中間件的個人總結,僅供參考。希望本文對你有所收獲,對于自定義中間件你有啥看法,歡迎留言討論或吐槽。
本文來自博客園,作者:{春光牛牛,yak},轉載請注明原文鏈接:http://www.rzrgm.cn/yakniu/p/17011221.html
歡迎各位大佬們評論指正
QQ討論群:610129902


浙公網安備 33010602011771號