【问题标题】:Why custom Middleware usage position affect its calling?为什么自定义中间件使用位置会影响其调用?
【发布时间】:2020-05-29 01:37:14
【问题描述】:

为什么会按预期工作:

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

【问题讨论】:

标签: c# asp.net-core middleware


【解决方案1】:

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

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

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

从上面的链接,文档状态:

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

对于一些人的爱和另一些人的恨,当涉及到预期的行为时,约定有点陷阱。

【讨论】:

    猜你喜欢
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多