物理文件夹破坏了在IIS Express上的ASP.NET URL路由。

8
当一个URL与我的ASP.NET项目中的物理文件夹相对应时,IIS Express会产生403.14 Forbidden错误,而这个URL本来应该通过ASP.NET URL路由进行处理。 (该文件夹仅包含代码,文件夹名称恰好与页面的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-未找到”的错误,出现了“您正在寻找的资源没有与之关联的处理程序”的消息。(错误页面上的详细错误信息显示我们在IIS Web Core模块中,在MapRequestHandler通知期间,处理程序尚未确定,并且有一个错误代码0x80070002,这是对应于Win32 ERROR_FILE_NOT_FOUND错误的COM HRESULT。)
令人困惑的是,它甚至都不问ASP.NET是否有一个处理程序。IIS似乎自己决定肯定没有处理程序。
只有在存在与URL匹配的文件夹时才会发生这种情况。所有其他具有动态确定URL的资源都可以正常工作 - IIS会请求ASP.NET处理程序,ASP.NET的路由机制按照正常方式运行,如果URL对应于我动态定义的页面之一,则所有内容都可以正常工作。只有存在物理文件夹会阻止所有这些工作。
我可以看到这是IIS在做这件事,因为我得到了一个IIS风格的错误页面,它们具有非常不同于ASP.NET生成的404页面的独特设计。(如果我尝试导航到既不对应于物理文件夹,也不对应于动态资源的URL,则会获得由ASP.NET生成的404页面。因此,通常情况下,IIS肯定会将请求移交给ASP.NET,但对于这些有问题的资源,IIS肯定会妨碍。)
我尝试在我的中添加此内容,以防问题是IIS已经决定与物理文件夹相对应的请求不符合managedHandler前提条件:
<modules runAllManagedModulesForAllRequests="true">

但这似乎并没有帮助 - 它仍然没有将ASP.NET路由涉及到与物理文件夹对应的URL。无论如何,这并不是最佳选择 - 我不想让托管处理程序运行在我确实想要处理为静态内容的内容上。事实上,我想要将ASP.NET URL路由用作后备 - 只有在URL绝对不引用静态内容时,我才希望它参与其中。
我不明白为什么在这种情况下ASP.NET甚至不询问ASP.NET的意见。如果存在一个与URL相对应的物理文件夹,为什么它在MapRequestHandler阶段不调用ASP.NET呢?
1个回答

3

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

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

请查看MSDN页面{{link1:不应用路由的情况}}。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接