为什么自定义中间件使用位置会影响其调用?

Why custom Middleware usage position affect its calling?

为什么这会按预期工作:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseRequestTimeoutMiddleware();
        app.UseExceptionHandlingMiddleware();

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

但这并没有:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });

        app.UseRequestTimeoutMiddleware();
        app.UseExceptionHandlingMiddleware();
    }

在第二种情况下,InvokeAsync 从未被调用,这就是我所说的不起作用。

它与 ASP.NET 核心中间件排序的工作方式有关。 Microsoft 有一些关于中间件排序的很棒的文档 here,但是为了更改这些文档,我将把其中的一些复制到这里。

查看下面的中间件执行顺序:

您可以看到 ASP.NET 核心通过中间件管道执行的顺序,端点路由是执行顺序中的最后一件事。通过在端点路由之后放置您的自定义中间件,它实际上在那个点被短路并且永远不会被击中(因为它遍历执行链)。

根据上面的 link,文档状态:

The order is critical for security, performance, and functionality.

对于某些人的爱和其他人的恨,约定在涉及预期行为时有点陷阱