为什么这会按预期工作:
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
,这就是我的意思是不起作用。
答案 0 :(得分:1)
这与ASP.NET Core中间件订购的工作方式有关。微软有一些很棒的文档here关于中间件订购,但是为了更改这些文档,我将其中一些复制到这里。
您可以看到ASP.NET Core通过中间件管道执行的顺序,端点路由是执行顺序中的最后一件事。通过将您的自定义中间件放置在端点路由之后,它实际上在那时候被短路并且永远不会受到攻击(因为它遍历执行链)。
在上面的链接中,文档状态为:
顺序对于安全性,性能和功能至关重要。
对于某些人的爱与恨,在约定的预期行为上,约定有点陷阱。