回到目錄 在進行.net core平臺之後,我們如果希望在請求過程中添加一些事件是非常容易的,你可以把這些事件做成一個中間件Middleware,然後這些中間件就會以Http pipeline的管道方式進行相應,並且它們就像是一個職責鏈,從你定義的第一個中間件開始,一個一個向下傳遞,直到最後一個中間 ...
在進行.net core平臺之後,我們如果希望在請求過程中添加一些事件是非常容易的,你可以把這些事件做成一個中間件Middleware,然後這些中間件就會以Http pipeline的管道方式進行相應,並且它們就像是一個職責鏈,從你定義的第一個中間件開始,一個一個向下傳遞,直到最後一個中間件完成為止!
前幾天我寫了在.net core里實現模塊化服務,DotNetCore跨平臺~組件化時代來了 主要是將我們定義的組件添加到IServiceCollection集合里,然後在程式啟動後去註冊它們,而今天要說的Middleware用到的是IApplicationBuilder,它在程式啟動後,載入與http請求相關的組件,這些組件以Pipeline的形式進行處理,也就是我們所說的中間件,下麵我來帶大家實現一個最簡單的Middleware!
從網上找的圖,挺形象
圖中記錄了一個請求進來,經過各個中間件的處理,最後逐個響應,下麵我們來看一下簡單的代碼實現,和服務組件化一樣,也是一個實現,一個擴展方法的調用,最後在startup里去使用它。
大叔Lind.DotNetCore框架里的Middleware
ResponseTimeMiddleware的實現
/// <summary> /// 響應時間的中間件 /// </summary> public class ResponseTimeMiddleware { private readonly RequestDelegate _next; public ResponseTimeMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { Stopwatch sw = new Stopwatch(); sw.Start(); Console.WriteLine("ResponseTimeMiddleware..."); await _next.Invoke(context); sw.Stop(); Console.WriteLine($"頁面響應時間為:{sw.ElapsedMilliseconds}ms"); } }
擴展方法去封裝它,以便於其它地方去使用它
/// <summary> /// Lind.DotNetCore.Middleware擴展方法 /// </summary> public static class MiddlewareExtensions { public static IApplicationBuilder UseResponseTime(this IApplicationBuilder builder) { return builder.UseMiddleware<ResponseTimeMiddleware>(); } public static IApplicationBuilder UseRequestKey(this IApplicationBuilder builder) { return builder.UseMiddleware<RequestKeyMiddleware>(); } public static IApplicationBuilder UseAuthorizationOperation(this IApplicationBuilder builder) { return builder.UseMiddleware<AuthorizationOperationMiddleware>(); } }
最後在startup里使用它,註意是在AddMvc方法前面,要不然對你的mvc,api是無效的,呵呵!
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseAuthorizationOperation(); app.UseResponseTime(); app.UseRequestKey(); app.UseStaticHttpContext(); app.UseMvc();
事實上,今天的中間件是.net core里非常大的亮點,其實早就應該寫這篇文章了,呵呵!
感謝各位的閱讀!