ASP.NET Core – Middleware
前言
MIddleware 就是中间件, ASP.NET Core 是用来处理 http request 的.
当 request 抵到 server 就进入了 Middleware pipe. 每个 pipe 会有不同职责 (比如验证 athen, autho, routing 等)
然后依据 request 的 information, 最终输出 response.
主要参考
执行顺序
一张图胜过千言万语.
Run
撇开 routing, razor pages 这些, 最简单的就是定义一个 Run, 它就可以处理所有的 request 了. 统统返回 Hello World text.
app.Run(async context => { await context.Response.WriteAsync("Hello, World!"); });
Run 属于 terminal middleware 终点站, 也就是说, 即便它后续还有其它的 Middleware 通通不会被执行了.
我们一般上很少会用这个.
Use
app.Use(async (context, next) => { // do something before next await next.Invoke(); // do something after next });
Use 就是最常使用的 Middleware 了, 它可以是 terminal 也可以不是, 取决于你有没有调用 next.Invoke
比如 authen, 在 before next 之前就可以从 request 中获取 token 然后做验证. 如果失败就返回 401 成功就 next.
比如 压缩, 在 after next 的时候对 response 进行压缩.
UseWhen
UseWhen 就只是多了一个判断, 看要不要跑 Run 或 Use 而已.
常用的情况比如, WebAPI 和 Razor Page 都用同一个 Application 的话, 就可以通过 request starts with /api 来决定用什么配置 (比如 UseExceptionHandler)
app.UseWhen(context => context.Request.Query.ContainsKey("branch"), appBuilder => { appBuilder.Use(async (context, next) => { // do something before next await next.Invoke(); // do something after next }); });
还有一个叫 MapWhen 它和 UseWhen 的区别是它里面是 Run, 而 UseWhen 里面是 Use.
Middleware Pipe 之间沟通
middleware 要通信, 一般上会使用 Request Features, 类似全局变量吧.
context.Features.Set<string>("dada"); var value = context.Features.Get<string>();
注: 它是用类似作为 key 的哦,
Build-in Middleware
MVC and Razor Page
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期