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