为什么自定义中间件使用位置会影响其调用?
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.
对于某些人的爱和其他人的恨,约定在涉及预期行为时有点陷阱。
为什么这会按预期工作:
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.
对于某些人的爱和其他人的恨,约定在涉及预期行为时有点陷阱。