中间件是ASP.NET Core的一个基本组成部分。它允许你灵活且模块化地处理请求和响应。中间件会在请求流经应用程序的请求管道时对请求进行处理,在响应返回时也会对响应进行处理。
本文将阐释中间件、其用途以及如何在ASP.NET Core中创建自定义中间件。我们会使用通俗易懂的术语和示例来帮助理解。
什么是中间件? 中间件是ASP.NET Core中的一个组件。简单来说,它用于处理HTTP请求和响应。可以将中间件看作是请求在抵达应用程序逻辑之前必须经过的一系列步骤。每一步都可以修改请求或响应,或者执行额外的任务。
中间件的示例包括:
身份验证:验证用户凭据。
授权:确保用户有权访问资源。
日志记录:跟踪请求的详细信息,以便进行调试或审计。
静态文件处理:提供诸如图片和CSS等静态文件的服务。
中间件的工作原理 当一个请求发送到ASP.NET Core应用程序时,它会经过一个管道。管道中的每个中间件都有机会:
处理请求。
将请求传递给下一个中间件。
在响应返回时对其进行处理。
管道中中间件的顺序很重要。较早添加的中间件可能会影响后续中间件的行为。
ASP.NET Core中的中间件与筛选器 《ASP.NET Core中的中间件与筛选器综合指南:含实际示例》 towardsdev.com
在ASP.NET Core中添加中间件 要使用中间件,需在
Program.cs
文件(旧版本中是Startup.cs
文件)中对其进行配置。以下是一个示例:
app.Use(async (context, next) =>
{
Console.WriteLine("在调用下一个中间件之前");
await next();
Console.WriteLine("在调用下一个中间件之后");
});
app.Use(async (context, next) =>
{
Console.WriteLine("正在处理请求");
await context.Response.WriteAsync("你好,中间件!");
});
在这个示例中:
第一个中间件会在调用
next()
之前和之后记录消息。第二个中间件会写入一个响应。
如果一个中间件没有调用next()
,它就会截断管道,后续的中间件将不会再运行。
ASP.NET Core中的内置中间件 ASP.NET Core提供了多个内置中间件。一些常见的中间件如下:
静态文件中间件: 用于提供静态文件(例如,图片、CSS、JavaScript文件)的服务。 示例:
app.UseStaticFiles();
路由中间件: 将请求映射到特定的端点。 示例:
app.UseRouting();
身份验证中间件: 处理用户身份验证。 示例:
app.UseAuthentication();
授权中间件: 处理用户授权。 示例:
app.UseAuthorization();
创建自定义中间件 有时,内置中间件无法满足你的需求。在这种情况下,你可以创建自定义中间件。下面我们来逐步介绍创建的步骤。
步骤1:创建中间件类 一个中间件类需要:
在其构造函数中接受一个
RequestDelegate
参数。拥有一个
InvokeAsync
方法来处理请求。
以下是一个示例:
public class CustomMiddleware
{
private readonly RequestDelegate _next;
public CustomMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// 预处理逻辑
Console.WriteLine("自定义中间件:在调用下一个之前");
// 调用管道中的下一个中间件
await _next(context);
// 后处理逻辑
Console.WriteLine("自定义中间件:在调用下一个之后");
}
}
步骤2:注册中间件 使用UseMiddleware
扩展方法在管道中注册中间件:
app.UseMiddleware<CustomMiddleware>();
app.Run(async (context) =>
{
await context.Response.WriteAsync("请求由终端中间件处理。");
});
使用Lambda表达式简化中间件 你可以使用Lambda函数而非类来创建简单的中间件。例如:
app.Use(async (context, next) =>
{
Console.WriteLine("在Lambda中间件之前");
await next();
Console.WriteLine("在Lambda中间件之后");
});
这种方法对于执行简单任务很有用。
实际示例:请求计时中间件 让我们创建一个中间件来测量处理一个请求所花费的时间。
步骤1:创建中间件
public class TimingMiddleware
{
private readonly RequestDelegate _next;
public TimingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var startTime = DateTime.UtcNow;
await _next(context);
var endTime = DateTime.UtcNow;
var processingTime = endTime - startTime;
Console.WriteLine($"请求在{processingTime.TotalMilliseconds}毫秒内处理完成");
}
}
步骤2:注册中间件 将其添加到管道中,例如将以下代码添加到Program.cs
文件中:
app.UseMiddleware<TimingMiddleware>();
app.Run(async (context) =>
{
await context.Response.WriteAsync("请求已完成。");
});
当你运行应用程序时,控制台将显示每个请求所花费的时间。
中间件顺序很重要 管道中中间件的顺序会影响其行为。例如:
app.UseAuthentication();
app.UseAuthorization();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
在这里,UseAuthentication
必须放在UseAuthorization
之前。否则,授权将会失败,因为用户尚未经过身份验证。
使用中间件处理错误 你也可以创建中间件来处理错误。例如:
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
Console.WriteLine($"错误:{ex.Message}");
context.Response.StatusCode = 500;
await context.Response.WriteAsync("发生了一个错误。");
}
}
}
将其注册到管道中,以便全局捕获异常。
《.NET 6中的全局异常处理》 .NET 6中处理异常的一种有效方式 enlear.academy
中间件是ASP.NET Core的一项强大功能。它允许你自定义处理请求和响应的方式。你可以针对常见任务使用内置中间件,也可以针对特定需求创建自定义中间件。
如果你喜欢我的文章,请给我一个赞!谢谢