静态文件中间件应在ASP.NET Core管道中的什么位置?

lon*_*nix 5 c# asp.net-core asp.net-core-2.1

我正在使用ASP.NET Core 2.1。我认为静态文件中间件应该先于mvc中间件-无需通过mvc运行请求即可css(例如)来提供文件。

所以我按以下顺序排列它们:

app.UseExceptionHandler(/*...*/)
app.UseHsts();
app.UseHttpsRedirection();
app.UseStatusCodePagesWithReExecute(/*...*/);
// and lastly:
app.UseStaticFiles();
app.UseMvc(/*...*/);
Run Code Online (Sandbox Code Playgroud)

但是,当我打开调试级别日志记录时,我注意到如果缺少静态文件,它将运行Microsoft.AspNetCore.Builder.RouterMiddleware并显示Request did not match any routes,然后运行my ErrorController并为该请求发出404。

所以:

  • 这是管道的正确顺序吗?
  • 有什么办法可以避免所有这些情况,还是设计使然?例如,一些“较轻”的过程无需完成所有操作即可触发404?就像可能首先使用静态文件中间件一样(不确定是否明智/安全)?

小智 3

这是管道的正确顺序吗?

是的。

但是,当我打开调试级别日志记录时,我注意到如果缺少静态文件,它会运行并Microsoft.AspNetCore.Builder.RouterMiddleware显示Request did not match any routes,然后运行我的 ErrorController 并针对该请求发出 404。为什么?

首先,丢失的静态文件请求正在通过异常处理程序、HSTS、HTTPS 重定向和 StatusCodePagesWithReExecute 中间件,但让我们忽略它们,因为没有什么有趣的。请求只是通过他们。

然后由静态文件中间件进行处理。中间件很快就会明白,该文件丢失了,只是让您的请求运行到下一个中​​间件,即 MVC 中间件。

MVC 中间件查看其路由表并找到“catchAll”路由并让其ErrorController处理请求。这就是丢失文件由ErrorController.

PS我想你有“catchAll”路线,如下所示:

app.UseMvc(routes =>
        {
            .... // your routes here

            routes.MapRoute("catchAll", "{*.}", new { controller = "Error", action = "Error404" }
        });
Run Code Online (Sandbox Code Playgroud)