一、中間件介紹
中間件是組裝到應用程序管道中用來理請求邏輯和響應邏輯的組件。
每個組件都可以:
1.選擇是否將請求傳遞給管道中的下一個組件。
2.調用管道中的下一個組件之前和之后執行的工作。
請求委托(Requestdelegates)用於構建請求管道,處理每個HTTP請求。
二、中間件處理流程
中間件的執行分為請求進來的邏輯與響應出去的邏輯,進來的邏輯按照注冊中間件的順序,響應出去的邏輯則相反。
中間件的請求流程由一系列請求委托組成,如下圖所示,分別注冊了三個中間件Middleware1,Middleware2,Middleware3。請求進來時會走請求邏輯logic,然后執行類型為Requestdelegates的委托對象next(),之后會走第二個中間件Middleware2的請求邏輯,如黑色箭頭所示,直到走完最后一個中間件后,會以Middleware3,Middleware2,Middleware1的順序走響應邏輯more logic。
三、自定義中間件
有很多中間件微軟已經給我提供了,但是如何自定義中間件呢?
第一步:定義一個類,並添加以下代碼
public class Middleware1 { private readonly RequestDelegate _next; /// <summary> /// 管道執行到該中間件時候下一個中間件的RequestDelegate請求委托,如果有其它參數,也同樣通過注入的方式獲得 /// </summary> /// <param name="next"></param> public Middleware1(RequestDelegate next) { //通過注入方式獲得對象 _next = next; } /// <summary> /// 自定義中間件要執行的邏輯 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task Invoke(HttpContext context) { Console.WriteLine("Request1");//請求進來時邏輯,為了驗證順序性,打印一句話 await _next(context);//把context傳進去執行下一個中間件 await context.Response.WriteAsync("<p>Response1</p>");//響應出去時邏輯,為了驗證順序性,輸出一句話 } }
第二步:在Startup類中的Configure方法下,通過調用UseMiddleware方法注冊中間件。如果自定義的中間件Invoke方法需要傳遞參數,則可以通過UseMiddleware方法把參數傳進去,而自定義的Middleware1則需要通過依賴注入的方式拿到所傳進去的參數
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { //按順序注冊Middleware1,Middleware2,Middleware3。Middleware2,Middleware3和Middleware1一樣,我就懶得寫了 app.UseMiddleware<Middleware1>(); app.UseMiddleware<Middleware2>(); app.UseMiddleware<Middleware3>(); }
執行結果: