目录
[1. 身份验证中间件](#1. 身份验证中间件)
ASP.NET Core 中,中间件(Middleware)是处理 HTTP 请求和响应的组件链。你可以在 Startup.cs
或 Program.cs
中通过 app.UseMiddleware<T>()
来添加中间件。除了使用内置的中间件,ASP.NET Core 允许你定义自己的中间件,以满足特定的业务需求。
一、常见的内置中间件
在 app.UseMiddleware
之前,ASP.NET Core 已经提供了很多常见的中间件,适用于不同的功能需求:
二、自定义中间件
自定义中间件可以帮助你在 ASP.NET Core 应用中实现各种业务逻辑,如身份验证、日志记录、性能监控、错误处理、请求响应修改等。通过 app.UseMiddleware<T>()
可以将自定义中间件添加到请求管道中,实现灵活、可定制的功能。
创建中间件类 : 中间件通常是一个类,它包含一个 Invoke
或 InvokeAsync
方法,该方法接收 HttpContext
并返回一个 Task
,通常会在方法内部执行一些逻辑,然后调用管道中的下一个中间件。
例如,定义一个简单的日志记录中间件:
public class LoggingMiddleware
{
private readonly RequestDelegate _next;
public LoggingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// 请求之前的日志
Console.WriteLine($"Request URL: {context.Request.Path}");
// 调用下一个中间件
await _next(context);
// 响应之后的日志
Console.WriteLine($"Response Status: {context.Response.StatusCode}");
}
}
RequestDelegate next
: 这是管道中下一个中间件的委托。ASP.NET Core 中间件是链式的,每个中间件都会调用 next(context)
来将请求传递给管道中的下一个中间件。
注册中间件 : 在 Configure
方法中通过 app.UseMiddleware<LoggingMiddleware>()
来将自定义中间件添加到请求处理管道中。
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<LoggingMiddleware>();
// 其他中间件
}
你可以将中间件放置在管道中的不同位置,根据执行顺序来决定它的作用范围。
自定义中间件的常见应用场景:
-
日志记录: 可以创建一个中间件来记录每个请求的详细信息(如请求 URL、请求体、响应状态码等),以便于后期分析和排查问题。
-
认证与授权: 如果你有一些自定义的认证或授权逻辑,可以创建中间件来在请求处理之前进行检查。
-
错误处理: 自定义错误处理程序可以捕获异常并根据需要返回适当的错误信息,或者记录详细的错误信息。
-
性能监控: 你可以创建中间件来衡量请求的响应时间,进行性能分析,记录执行时间等。
-
CORS 自定义: 你可以实现自定义的跨域资源共享(CORS)策略,根据请求的来源和其他条件来判断是否允许跨域访问。
-
请求/响应修改: 你可以在中间件中处理请求和响应数据,例如修改请求的头部信息,或者在响应中添加一些自定义的头部或数据。
-
请求计数与速率限制: 实现请求计数器或者速率限制器,中间件可以根据请求数量限制特定 API 的调用频率。
三、中间件的执行顺序
中间件的执行顺序是按照它们被注册的顺序来执行的。即先注册的中间件会先执行,后注册的中间件会后执行。
- 请求管道:请求从上到下,依次通过所有中间件。每个中间件可以选择修改请求并传递给下一个中间件。
- 响应管道:响应从下到上,依次经过中间件进行修改。每个中间件都可以选择修改响应并传递给上一个中间件。
四、其他自动逸中间件案例
1. 身份验证中间件
如果你想要在请求过程中对用户进行身份验证,可以创建一个中间件来检查用户的认证信息(如 JWT 令牌):
public class AuthenticationMiddleware
{
private readonly RequestDelegate _next;
public AuthenticationMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
if (string.IsNullOrEmpty(token))
{
context.Response.StatusCode = 401; // Unauthorized
await context.Response.WriteAsync("Unauthorized");
return;
}
// 验证 token 逻辑...
// 继续处理请求
await _next(context);
}
}
2、跨域中间件(CORS)
创建一个中间件来根据请求的来源动态处理 CORS:
public class CorsMiddleware
{
private readonly RequestDelegate _next;
public CorsMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var origin = context.Request.Headers["Origin"];
if (origin != null && origin == "https://alloweddomain.com")
{
context.Response.Headers.Add("Access-Control-Allow-Origin", origin);
}
await _next(context);
}
}