【问题标题】:Physical Folder Breaks ASP.NET URL Routing on IIS Express物理文件夹破坏 IIS Express 上的 ASP.NET URL 路由
【发布时间】:2013-07-12 09:00:04
【问题描述】:

当原本通过 ASP.NET URL 路由处理的 URL 恰好对应于我的 ASP.NET 项目中的物理文件夹时,IIS Express 会产生 403.14 Forbidden 错误。 (文件夹只包含代码,巧合的是文件夹名称恰好与页面的 URL 匹配;我的 URL 结构是由数据库动态确定的,用户可以编辑该结构,所以虽然我可以重命名我的项目文件夹,一般来说,我无法阻止这种碰撞的发生。)

这似乎是因为DirectoryListingModule 介入处理请求,然后由于目录浏览被禁用而立即失败。我试过删除这个:

<system.webServer>
  <handlers>
    <remove name="StaticFile" />
    <add name="StaticFile" path="*" verb="*"
         modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
  </handlers>
</system.webServer>

这将删除默认的 StaticFile 处理程序配置,该配置具有 modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule",并将其替换为仅提供我想要的功能的配置。 (我想要静态文件服务,但我不需要此应用程序中的目录列表或默认文档。)但效果似乎是当我点击时 IIS 会产生一个完全空的(0 字节)响应(状态为 200)违规页面。

接下来,我尝试将 StaticFile 处理程序配置为仅处理我想要提供的特定物理文件夹:

<system.webServer>
  <handlers>
    <remove name="StaticFile" />
    <add name="StaticFileCss" path="style/*.css" verb="*"
         modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
    <add name="StaticFileScripts" path="Scripts/*" verb="*"
         modules="StaticFileModule" resourceType="Either" requireAccess="Read" />
  </handlers>
</system.webServer>

但是当我点击有问题的 URL 时,这会产生 404.4 - Not found 错误,并带有 The resource you are looking for does not have a handler associated with it. 的消息。 (错误页面的详细错误信息说我们在IIS Web Core模块中,在MapRequestHandler通知期间,处理程序是Not yet determined,并且有一个错误代码0x80070002,这是一个COM HRESULT对应于 Win32 ERROR_FILE_NOT_FOUND 错误。)

令人费解的是,它甚至都懒得问 ASP.NET 是否有它的处理程序。 IIS 似乎自己决定绝对没有处理程序。

仅当存在与 URL 匹配的文件夹时才会发生这种情况。具有动态确定 URL 的所有其他资源都可以正常工作 - IIS 向 ASP.NET 请求处理程序,ASP.NET 的路由机制正常运行,如果 URL 对应于我动态定义的页面之一,则一切正常。只是物理文件夹的存在阻止了这一切。

我可以看到是 IIS 执行此操作,因为我得到了一个 IIS 样式的错误页面之一,用于此 404,并且它们具有与 ASP.NET 生成的 404 非常不同的独特设计。 (如果我尝试导航到既不对应于物理文件夹也不对应于动态资源的 URL,我会得到一个由 ASP.NET 生成的 404 页面。所以通常情况下,IIS 肯定会将请求移交给 ASP.NET,但 IIS肯定会妨碍这些有问题的资源。)

我尝试将其添加到我的&lt;system.WebServer&gt; 中,以防问题在于 IIS 已确定与物理文件夹对应的请求不满足 managedHandler 前提条件:

<modules runAllManagedModulesForAllRequests="true">

但这似乎没有帮助 - 它仍然没有涉及与物理文件夹对应的 URL 的 ASP.NET 路由。在任何情况下,这都不是最理想的——我不希望托管处理程序为我绝对想作为静态内容处理的内容运行。我实际上希望将 ASP.NET URL 路由用作支持 - 我只希望它在 URL 绝对不引用静态内容时发挥作用。

我不明白为什么 ASP.NET 甚至没有询问 ASP.NET 在这种情况下的想法。为什么在MapRequestHandler 阶段如果有一个物理文件夹恰好对应于该 URL,它为什么不调用 ASP.NET?

【问题讨论】:

    标签: asp.net iis asp.net-routing


    【解决方案1】:

    当找到与路由具有相同 URL 的物理文件或文件夹时,路由将不会处理请求并提供物理文件。

    您可以通过将 RouteCollection 对象的 RouteExistingFiles 属性设置为 true 来更改此行为。

    看看MSDN页面Scenarios when routing is not applied

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 2017-02-24
      相关资源
      最近更新 更多