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

时间:2018-07-06 10:12:26

标签: 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(/*...*/);

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

所以:

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

2 个答案:

答案 0 :(得分:2)

  

这是管道的正确顺序吗?

是的。

  

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

首先,您缺少的静态文件请求正在通过异常处理程序,HSTS,HTTPS重定向和StatusCodePagesWithReExecute中间件进行处理,但是让我们忽略它们,因为没有什么有趣的东西。请求只是通过它们传递的。

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

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

P.S。我想您有“ catchAll”路线,如下所示:

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

            routes.MapRoute("catchAll", "{*.}", new { controller = "Error", action = "Error404" }
        });

答案 1 :(得分:1)

要减轻负担,您可以使用类似以下的自定义中间件:

var avoidFolders = new string[] { "js", "css" };

app.Use(async (context, next) => {
    if (avoidFolders.Contains(context.Request.Path.Value.Trim('/')))
        context.Response.StatusCode = 404;
    else await next();
});

尽管您必须在数组中包括每个静态文件夹,但它可以确保直接返回404,而无需继续进行路由。