ASP.NET Core – Middleware

前言

MIddleware 就是中间件, ASP.NET Core 是用来处理 http request 的.

当 request 抵到 server 就进入了 Middleware pipe. 每个 pipe 会有不同职责 (比如验证 athen, autho, routing 等)

然后依据 request 的 information, 最终输出 response.

 

主要参考

ASP.NET Core Middleware

 

执行顺序

一张图胜过千言万语.

 

 

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

 

posted @ 2021-10-22 16:49  兴杰  阅读(103)  评论(0编辑  收藏  举报