百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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)。这每一种方法各有其...

OpenVPN客户端配置_openvpn客户端配置文件解析

...

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的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...