【问题标题】:Why does order between UseStaticFiles and UseDefaultFiles matter?为什么 UseStaticFiles 和 UseDefaultFiles 之间的顺序很重要?
【发布时间】:2019-05-28 01:38:53
【问题描述】:

我了解中间件may matter的注册顺序。但是,并不一定是这样。

我注意到 UseDefaultFiles() 需要在 UseStaticFiles() 之前(这可以巧妙地被 UseFileServer() 规避)。

我不明白为什么。它们是如何碰撞的?!

我已经用谷歌搜索了这个问题,但对于 为什么 在这种特殊情况下订单很重要的动机为零。只是它很重要......

【问题讨论】:

    标签: c# .net-core asp.net-core-2.2


    【解决方案1】:

    来自docs:

    UseDefaultFiles 必须在 UseStaticFiles 之前调用以提供默认文件。 UseDefaultFiles 是一个 URL 重写器,它实际上并不提供文件。通过UseStaticFiles 启用静态文件中间件以提供文件。

    中间件的顺序很重要,这就是为什么,例如,UseStaticFiles 必须在 UseMvc 之前,因为 MVC 引擎将处理所有请求。在这种情况下,UseDefaultFiles 只是简单地重写 URL 并将其传递给 UseStaticFiles 中间件以提供服务。

    【讨论】:

      【解决方案2】:

      UseDefaultFiles() 应始终在 UseStaticFiles() 之前。

      这是因为 UseDefaultFiles 重写了 URL。使用静态文件仅提供 URL。

      如果在 URL 重写之前提供文档,那么您可能无法获得默认文档。

      参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-2.2#serve-a-default-document

      【讨论】:

      • 我认为 UseStaticFiles() 将标志设置为 true 以启用非动态文件可访问。因此,我看不到允许获取静态文件的问题,然后,如果 URL 没有指向实际文件,请尝试添加 index.html, default.html 等等。你怎么看?
      • 在我看来,我们必须了解 asp.net 如何提供文件。服务中间件的文件只是将实际 url 映射到站点资源。一旦决定了要提供的资源,url 保持不变或重写都没有关系。 url 的唯一目的是在那个时候完成。只需考虑一下,如果在检查它可能映射到的资源后更改了 url,那么框架将再次以某种方式将请求移交给前一个模块以提供内容。这可能会导致代码重复或性能问题,因为资源映射必须进行两次。
      【解决方案3】:

      取自Static files in ASP.NET Core 上的文档(在提供默认文档下,有一个重要注释)。

      UseDefaultFiles 必须在 UseStaticFiles 之前调用以提供默认文件。 UseDefaultFiles 是一个 URL 重写器,它实际上并不提供文件。通过UseStaticFiles 启用静态文件中间件以提供文件。

      基于此,在提供实际文件 (UseStaticFiles) 之前,首先设置 URL 重写器 (UseDefaultFiles) 非常重要。
      如果您不这样做,UseStaticFiles 中间件将首先启动,但对应用程序根目录的请求不会告诉中间件要服务哪个“文件”。当您确保首先进行了重写时,对应用程序根目录的请求将被重写为对(其中一个)默认文件的请求。

      【讨论】:

      • 对不起。什么是 URL 重写器?什么是“实际上不提供文件”?我不明白。
      猜你喜欢
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2018-02-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多