5行代码搞定ASP.NET Core中间件!从入门到实战
haoteby 2025-10-08 17:07 10 浏览
每次开发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中间件)
相关推荐
- 如何为MySQL服务器和客户机启用SSL?
-
用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...
- k8s 证书问题排查_k8s dashboard 证书
-
从去年开始一些老项目上陆陆续续出现一些列的证书问题,(证书原理这里就不说了,官方文档一堆)多数刚开始的表现就是节点的kubelet服务起不来,节点状态NotReady表现日志如下failed...
- 企业级网络互通方案:云端OpenVPN+爱快路由器+Win11互联实战
-
企业级网络互通方案:OpenVPN搭建公有云+爱快路由器+Win11三地互联实战指南「安全高效」三地局域网秒变局域网实施环境说明...
- OpenV** Server/Client配置文件详解
-
Server配置详解...
- 接口基础认知:关键信息与合规前提
-
1.核心技术参数(必记)...
- S交换机通过SSH登录设备配置示例(RADIUS认证+本地认证独立)
-
说明:●本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。●通过不同的管理域来实现RADIUS认证与本地认证两种方式同时使用,两...
- SSL证书如何去除私钥密码保护_ssl证书怎么取消
-
有时候我们在生成证书的时候可以加入了密码保护。然后申请到证书安装到了web服务器。但是这样可能会带来麻烦。每次重启apache或者nginx的时候,都需要输入密码。那么SSL证书如何去除私钥密码保护。...
- SSL证书基础知识与自签名证书生成指南
-
一、证书文件类型解析...
- S交换机通过SSH登录设备配置示例(RADIUS认证)
-
说明:本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。假设已在RADIUS服务器上创建了用户名yc123,密码test#123。对...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- HTTPS TLS握手流程_进行tls握手
-
1.客户端向服务器发送`ClientHello`消息,包括支持的TLS版本、加密套件、随机数等信息。2.服务器收到`ClientHello`消息后,解析其中的信息,并根据配置选择一个加密套件。3....
- Spring Boot 单点登录(SSO)实现_spring boot 单点登录jwt
-
SpringBoot单点登录(SSO)实现全指南单点登录(SingleSign-On,SSO)是一种身份验证机制,允许用户使用一组凭证登录多个相关但独立的系统。在微服务架构和企业级系统中,SS...
- 源码分享:在pdf上加盖电子签章_pdf如何加盖电子公章
-
在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...
- 微信支付商户API证书到期 怎么更换
-
微信支付商户API证书到期更换是一个非常重要的操作,需要仔细按照流程进行。如果证书过期,所有通过API的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...