8

403.14 Forbidden当原本通过 ASP.NET URL 路由处理的 URL 恰好对应于我的 ASP.NET 项目中的物理文件夹时,IIS Express 会产生错误。(文件夹只包含代码,巧合的是文件夹名称恰好与页面的 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,这是一个与Win32错误对应的COM HRESULT ERROR_FILE_NOT_FOUND。)

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

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

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

我尝试在我的<system.WebServer>.managedHandler

<modules runAllManagedModulesForAllRequests="true">

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

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

4

1 回答 1

3

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

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

看看MSDN页面Scenarios when routing is not applied

于 2013-08-01T07:03:17.740 回答