物理文件夹在IIS Express上中断ASP.NET URL路由

时间:2013-07-12 09:00:05

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

当通过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>

但是,当我点击有问题的网址时,会产生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,并且错误代码为{{1这是一个对应于Win32 0x80070002错误的COM HRESULT。)

令人费解的是,问问ASP.NET是否有处理程序甚至都没困扰。 IIS似乎自己决定肯定没有处理程序。

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

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

我尝试在ERROR_FILE_NOT_FOUND内添加此内容,以防问题是IIS已确定与物理文件夹相对应的请求不符合<system.WebServer>前提条件:

managedHandler

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

我不明白为什么ASP.NET甚至没有问ASP.NET在这种情况下它的想法。如果存在与URL对应的物理文件夹,为什么在<modules runAllManagedModulesForAllRequests="true"> 阶段没有调用ASP.NET?

1 个答案:

答案 0 :(得分:3)

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

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

查看MSDN页面Scenarios when routing is not applied