每次开发Web应用时,是不是总遇到这些需求:记录所有请求日志、验证API访问权限、统一处理异常?这些重复劳动其实用中间件5行代码就能搞定!今天就带大家从0到1理解ASP.NET Core中间件,亲手写一个能直接用的自定义管道。
一、中间件到底是个啥?用"餐厅流水线"讲明白
中间件(Middleware)是ASP.NET Core处理请求的"流水线工人"。想象你去餐厅点餐:
- 请求就像"点单",从门口(第一个中间件)传到后厨(最后一个中间件)
- 响应就像"上菜",从后厨反向传回到门口
- 每个中间件可以"加工"请求(比如记录点单内容)、"拦截"异常(比如发现没食材直接告知顾客),或者"放行"给下一个中间件
▲ 中间件流水线:请求从左到右,响应从右到左,形成"U型"处理流程
二、5行代码实现!记录请求日志的中间件
废话不多说,直接上代码!假设我们要记录每个请求的访问时间和路径,只需5行核心代码:
var app = WebApplication.Create(); // 1. 创建Web应用
app.Use(async (context, next) => { // 2. 添加自定义中间件
Console.WriteLine(#34;[{DateTime.Now:HH:mm:ss}] 访问了:{context.Request.Path}"); // 记录日志
await next(); // 3. 传给下一个中间件
});
app.MapGet("/", () => "Hello World!"); // 4. 定义默认接口
app.Run(); // 5. 启动应用
代码解析:
- 第1行:创建ASP.NET Core应用实例
- 第2-3行:Use方法添加中间件,context包含请求信息,next()是"传话筒",告诉下一个中间件"该你了"
- 第4行:定义根路径/的响应内容
- 第5行:启动应用,监听请求
运行后访问http://localhost:5000,控制台会输出:
[14:30:25] 访问了:/
▲ 中间件运行效果:每次请求都会自动记录日志
三、实战:3个常用中间件场景,直接抄作业
1. API Key认证:防止接口被恶意调用
很多API需要密钥才能访问,用中间件10行代码搞定:
app.Use(async (context, next) => {
// 从请求头获取API Key
if (!context.Request.Headers.TryGetValue("X-API-Key", out var apiKey)
|| apiKey != "MY_SECRET_KEY") { // 换成你的密钥
context.Response.StatusCode = 401; // 未授权
await context.Response.WriteAsync("API Key错误!");
return; // 拦截请求,不再传给下一个中间件
}
await next(); // 密钥正确,放行
});
2. 跨域处理:让前端能调用你的API
前后端分离项目必用!ASP.NET Core内置CORS中间件,一句话开启:
app.UseCors(policy => policy.AllowAnyOrigin().AllowAnyHeader()); // 开发环境用,生产环境限制域名
3. 异常处理:统一返回友好错误
全局捕获异常,避免给用户显示堆栈信息:
app.UseExceptionHandler(app => app.Run(async context => {
context.Response.StatusCode = 500;
await context.Response.WriteAsync("服务器开小差了,请稍后再试~");
}));
四、记牢这3个"坑",否则项目必出错!
1. 中间件顺序不能乱!
错误示例:把授权中间件放在路由中间件前面,会导致授权失败。
正确顺序(从先到后):
异常处理 → HTTPS重定向 → 静态文件 → CORS → 认证 → 授权 → 路由 → 端点
▲ 中间件顺序示意图:像排队一样,前面的人先处理
2. 别忘记调用await next()
如果中间件没写await next(),请求会被"卡住",后面的中间件和接口都不会执行!
3. .NET 9用户必看:用MapStaticAssets替代UseStaticFiles
.NET 9新特性!MapStaticAssets会自动压缩静态文件(CSS/JS)、生成内容哈希(避免缓存问题),性能提升80%+:
app.MapStaticAssets(); // 代替 app.UseStaticFiles()
五、总结:中间件是个"万能工具"
中间件就像ASP.NET Core的"插件系统",无论是日志、认证、限流,还是自定义业务逻辑,都能通过它优雅实现。记住今天的5行代码模板,以后遇到类似需求,直接套用就行!
动手试试:把日志中间件改成记录访问IP,或者给响应头加个自定义标识,5分钟就能搞定~
(案例参考:Andrew Lock的开源项目blog-examples,微软官方文档ASP.NET Core中间件)