为什么ASP.NET Core仅执行一次自定义中间件?

Kzr*_*tof 8 c# middleware asp.net-core

我有一个带有以下控制器的ASP.NET Core,该控制器接受POST请求:

[Route("api/v1/tenants/tests")]
public class TestsController : Controller
{
    [HttpPost]       
    public IActionResult Post(string tenantId)
    {
        return Ok();
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经开发了一种“空”中间件来进行测试。它ConfigureStartup.cs文件的方法中定义:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
     if (env.IsDevelopment())
     {
         app.UseDeveloperExceptionPage();
     }

     app.UseMvc();

     app.Use(async (context, next) =>
     {
         // Forward to the next one.
         await next.Invoke();
     });
}
Run Code Online (Sandbox Code Playgroud)

当我通过Postman调用控制器时,对该POST方法的初始调用成功通过中间件,然后成功到达控制器。但是,以下调用直接转到Controller,完全跳过了中间件。这是为什么?

Kzr*_*tof 11

必须在调用之前设置中间件app.UseMvc()

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
     if (env.IsDevelopment())
     {
         app.UseDeveloperExceptionPage();
     }

     app.Use(async (context, next) =>
     {
         // Forward to the next one.
         await next.Invoke();
     });

     // !! Have to be called after setting up middleware !!
     app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)

该信息存在于文档中,但我不知道它也适用于定制中间件:

在Startup.Configure方法中添加中间件组件的顺序定义了对请求调用中间件组件的顺序以及响应的相反顺序。该顺序对于安全性,性能和功能至关重要。

以下Startup.Configure方法为常见的应用程序场景添加了中间件组件:

1-异常/错误处理

2-HTTP严格传输安全协议

3-HTTPS重定向

4-静态文件服务器

5-Cookie政策执行

6-验证

7-会议

8-MVC

更新资料

在ASP.Net Core 3.0中,您需要先添加中间件 MapControllers()

 app.UseEndpoints(endpoints =>
 {
     endpoints.MapControllers();
 });
Run Code Online (Sandbox Code Playgroud)