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

时间:2020-05-29 01:37:14

标签: c# asp.net-core middleware

为什么这会按预期工作:

    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,这就是我的意思是不起作用。

1 个答案:

答案 0 :(得分:1)

这与ASP.NET Core中间件订购的工作方式有关。微软有一些很棒的文档here关于中间件订购,但是为了更改这些文档,我将其中一些复制到这里。

查看下面的中间件执行顺序:enter image description here

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

在上面的链接中,文档状态为:

顺序对于安全性,性能和功能至关重要。

对于某些人的爱与恨,在约定的预期行为上,约定有点陷阱

相关问题