ASP.NET Core中創建中間件的幾種方式
前言
今天我們一起來盤點一下在ASP.NET Core應用程序中添加和創建中間件常見的四種方式。
中間件介紹
ASP.NET Core中間件(Middleware)是用于處理HTTP請求和響應的組件,它們被安排在請求處理管道中,并按順序執行。中間件的設計是為了使其在請求處理管道中能夠以靈活和可擴展的方式處理 HTTP 請求和響應。
下圖顯示了 ASP.NET Core MVC 和 Razor Pages 應用的完整請求處理管道:
“
了解現有中間件的順序,以及在哪里添加自定義中間件。你可以完全控制如何重新排列現有中間件,或根據場景需要注入新的自定義中間件。
圖片
中間件用途
開發者通過在請求處理管道中添加不同的中間件(Middleware)組件,可以實現應用程序的認證和授權、日志記錄、異常處理、靜態文件處理、路由和端點映射、CORS(跨域資源共享)、會話管理、請求壓縮、國際化和本地化、緩存等各種功能。
通過請求委托添加中間件
我們可以通過在 WebApplication 實例上調用 Use 方法,并提供一個帶有兩個參數的 lambda 方法來實現。第一個參數是 HttpContext,第二個參數是管道中的實際下一個請求委托。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
// 在這里處理請求
// ...
await next.Invoke();
// 在這里處理響應
// ...
});
app.Run();
按約定添加中間件
ASP.NET Core中提供了許多內置中間件,例如靜態文件中間件、路由、認證、授權中間件等。這些中間件通常已經預先定義好了,開發者只需按照約定調用相應的方法即可。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// 使用靜態文件中間件
app.UseStaticFiles();
// 使用路由中間件
app.UseRouting();
// 使用認證中間件
app.UseAuthentication();
// 使用授權中間件
app.UseAuthorization();
app.Run();
創建自定義中間件類
創建自定義中間件類
首先我們創建一個自定義中間件類 RequestLoggingMiddleware,它將記錄每個請求的詳細信息。
public class RequestLoggingMiddleware
{
private readonly RequestDelegate _next;
public RequestLoggingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// 記錄請求信息
Console.WriteLine($"Request Method: {context.Request.Method}");
Console.WriteLine($"Request Path: {context.Request.Path}");
// 調用下一個中間件
await _next(context);
// 記錄響應狀態碼
Console.WriteLine($"Response Status Code: {context.Response.StatusCode}");
}
}
創建擴展方法
為了方便在應用程序中注冊中間件,我們可以創建一個擴展方法。
public static class RequestLoggingMiddlewareExtensions
{
public static IApplicationBuilder UseRequestLogging(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestLoggingMiddleware>();
}
}
在應用程序中使用自定義中間件
在 Program.cs 文件中,使用自定義中間件。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// 使用自定義中間件
app.UseRequestLogging();
app.Run();
添加基于工廠的中間件
IMiddlewareFactory 是 ASP.NET Core 中用于創建和管理中間件實例的接口。它提供了一種靈活的方式來控制中間件的創建和生命周期管理,特別是在需要復雜依賴注入或條件實例化的場景中。
創建自定義中間件工廠
實現 IMiddlewareFactory 接口的自定義工廠類。
public class CustomMiddlewareFactory(IServiceProvider serviceProvider) : IMiddlewareFactory
{
private readonly IServiceProvider _serviceProvider = serviceProvider;
public IMiddleware? Create(Type middlewareType)
{
// 使用服務提供者創建中間件實例
return _serviceProvider.GetService(middlewareType) as IMiddleware;
}
public void Release(IMiddleware middleware)
{
// 如果需要,可以在這里釋放中間件實例(容器負責釋放資源)
(middleware as IDisposable)?.Dispose();
}
}
創建自定義中間件
實現 IMiddleware 接口的自定義中間件類。
public class CustomMiddleware : IMiddleware
{
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
Console.WriteLine("在這里處理請求.......");
await next(context);
Console.WriteLine("在這里處理響應.......");
}
}
注冊中間件和工廠
在 Program.cs 文件中注冊自定義中間件和工廠。
var builder = WebApplication.CreateBuilder(args);
// 注冊中間件和工廠到依賴注入容器
builder.Services.AddTransient<CustomMiddleware>();
builder.Services.AddTransient<IMiddlewareFactory, CustomMiddlewareFactory>();
var app = builder.Build();
// 使用基于工廠的中間件
app.UseMiddleware<CustomMiddleware>();
app.Run();
最后總結
在ASP.NET Core中添加和創建中間件的方式有很多種,本文列舉了四種常見的方式,具體取決于你的需求和偏好。每種方式都有其適用的場景,選擇合適的方法可以使你的代碼更加簡潔和易于維護。
參考文章
- https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-8.0
- https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/extensibility?view=aspnetcore-8.0