DotNetCore跨(kua)平臺~聊(liao)聊(liao)中(zhong)間件
在進(jin)行.net core平臺之(zhi)后,我們(men)如果希望在請求(qiu)過程中添加一(yi)些(xie)事件(jian)(jian)(jian)是非常容易(yi)的(de),你(ni)可(ke)以(yi)(yi)把這(zhe)些(xie)事件(jian)(jian)(jian)做成一(yi)個(ge)中間(jian)件(jian)(jian)(jian)Middleware,然后這(zhe)些(xie)中間(jian)件(jian)(jian)(jian)就會以(yi)(yi)Http pipeline的(de)管道方式(shi)進(jin)行相應,并(bing)且它們(men)就像是一(yi)個(ge)職(zhi)責鏈,從(cong)你(ni)定(ding)義的(de)第一(yi)個(ge)中間(jian)件(jian)(jian)(jian)開始,一(yi)個(ge)一(yi)個(ge)向下(xia)傳遞,直到(dao)最后一(yi)個(ge)中間(jian)件(jian)(jian)(jian)完成為(wei)止(zhi)!
前幾天我寫了在.net core里實現模塊化服務,DotNetCore跨平臺~組件化時代來了 主要是(shi)將我(wo)們定義的(de)(de)(de)組件(jian)(jian)添加(jia)到IServiceCollection集合里,然(ran)后(hou)在(zai)程(cheng)序(xu)啟動后(hou)去注冊它們,而今天要說的(de)(de)(de)Middleware用到的(de)(de)(de)是(shi)IApplicationBuilder,它在(zai)程(cheng)序(xu)啟動后(hou),加(jia)載(zai)與http請求(qiu)相關的(de)(de)(de)組件(jian)(jian),這些組件(jian)(jian)以Pipeline的(de)(de)(de)形式進行處理,也就是(shi)我(wo)們所說的(de)(de)(de)中間件(jian)(jian),下面我(wo)來帶大家實現(xian)一個最(zui)簡單(dan)的(de)(de)(de)Middleware!
從(cong)網上找(zhao)的圖,挺形(xing)象

圖(tu)中記錄了一(yi)(yi)個請求進來,經過各個中間件(jian)(jian)的(de)處理(li),最后(hou)逐個響應,下面我(wo)們(men)來看(kan)一(yi)(yi)下簡單的(de)代碼實(shi)現,和服(fu)務組件(jian)(jian)化一(yi)(yi)樣,也是一(yi)(yi)個實(shi)現,一(yi)(yi)個擴(kuo)展(zhan)方(fang)法(fa)的(de)調(diao)用,最后(hou)在startup里去使用它。
大(da)叔(shu)Lind.DotNetCore框架里的Middleware

ResponseTimeMiddleware的實(shi)現
/// <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($"頁(ye)面(mian)響應時間(jian)為(wei):{sw.ElapsedMilliseconds}ms"); } }
擴展方(fang)法去封裝它(ta)(ta),以便于其它(ta)(ta)地方(fang)去使用它(ta)(ta)
/// <summary> /// Lind.DotNetCore.Middleware擴(kuo)展方法 /// </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>(); } }
最后在(zai)startup里使用它,注意是在(zai)AddMvc方法前面(mian),要不然對你的(de)mvc,api是無效(xiao)的(de),呵呵!
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseAuthorizationOperation(); app.UseResponseTime(); app.UseRequestKey(); app.UseStaticHttpContext(); app.UseMvc();
事實(shi)上,今天的(de)中間件是(shi).net core里非常大的(de)亮點,其實(shi)早就應該寫這篇文章了,呵呵!
感謝各位的閱讀!