中間件是什麼
想知道如何自定義中間件,最起碼要先了解一下ASP.NET Core的中間件是什麼,根據微軟官方的解釋,中間件是用於處理請求和響應。在以前使用ASP.NET開發的時代,對於處理請求和響應我們都是使用HttpModule和HttpHandler來處理的,但在ASP.NET Core中都替換成了中間件,因爲ASP.NET Core是基於一系列中間件構建的。
中間件執行流程
從上圖我們可以看出中間件是一個接着一個被調用的,然後響應時以相反的順序返回,每個中間件都可以選擇是否傳遞到下一個中間件,從而自己處理該請求,也稱爲管道短路,這種方式可以避免不必要的處理。
如何使用中間件
ASP.NET Core內置了很多中間件,那麼如何使用呢?在ASP.NET Core中有提供三種方法來使用中間件,分別是Run、Map與Use方法。
Run:會短路管道,不會執行下面中間件,一般只放在管道底部使用。
app.Run(async (context) =>{ await context.Response.WriteAsync(“Run方法”) });
Map:基於給定請求路徑的匹配項來創建請求管道分支。
private static void HandleMapTest1(IApplicationBuilder app)
{
app.Map("/map1", HandleMapTest1);
}
Use:可以將多個管道鏈接在一起,可通過不調用下一個中間件使管道短路。
app.Use(async (context, next) =>{ await next.Invoke(); });
如何自定義中間件
雖然ASP.NET Core內置了很多中間件,但可能有時候無法滿足需求,這時候就需要自定義中間件了,下面是自定義中間件步驟和示例代碼。
(1) 在ASP.NET Core Web應用程序中新建一個類
public class RequestUserCheckMiddleware
{
private readonly RequestDelegate _next;
public RequestUserCheckMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
string userName = context.Request.Query["UserName"];
if(!string.IsNullOrEmpty(userName)&&userName.ToLower().Contains("admin"))
{
await context.Response.WriteAsync("用戶名:" + userName);
await _next(context);
}
else
{
await context.Response.WriteAsync("非法用戶");
}
}
}
(2) 定義擴展方法公開中間件
public static class RequestUserCheckExtensions
{
public static IApplicationBuilder UseRequestUserCheck(this IApplicationBuilder builder) {
return builder.UseMiddleware<RequestUserCheckMiddleware>();
}
}
(3)使用自定義的中間件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRequestUserCheck();//用戶檢查
app.Run(async (context) =>
{
await context.Response.WriteAsync($"Hello {CultureInfo.CurrentCulture.DisplayName}");
});
}
相信你看完這篇文章已知道如何自定義中間件了吧,中間件是外層請求最先處理地方,可以提前做過濾工作,但不適合寫業務邏輯。