一、简介
中间件可以用于鉴权、日志,拦截器可以用于指定方法或url的业务逻辑处理,两者分工不同,实现效果相似,先执行中间件,后执行拦截器,再到WebAPI接口。
二、示例
一个Token验证中间件
三、代码
1.Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 省略其余代码
// 注册 Token 校验中间件(示例)
app.UseMiddleware<TokenValidationMiddleware>();
// 省略其余代码
}
2.TokenValidationMiddleware.cs
public class TokenValidationMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<TokenValidationMiddleware> _logger;
public TokenValidationMiddleware(RequestDelegate next, ILogger<TokenValidationMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
// 检查 URL 是否以 api/getbook 开头
if (context.Request.Path.StartsWithSegments("/api/DemoService/GetCityData"))
{
var token = context.Request.Headers["Authorization"].FirstOrDefault();
if (string.IsNullOrEmpty(token) || !ValidateToken(token))
{
// 如果没有Token或Token无效,返回未授权错误
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
await context.Response.WriteAsync("授权错误!");
return;
}
}
// 如果Token有效或路径不匹配,则继续执行下一个中间件
await _next(context);
}
catch (System.Exception ex)
{
_logger.LogError(ex.ToString());
}
}
// Token 校验逻辑(仅示例)
private bool ValidateToken(string token)
{
return token == "123456";
}
}