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

Ian*_*ths 8 asp.net iis asp.net-routing

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>
Run Code Online (Sandbox Code Playgroud)

这将删除默认的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>
Run Code Online (Sandbox Code Playgroud)

但是当我点击有问题的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,它是与HR32 ERROR_FILE_NOT_FOUND错误对应的COM HRESULT .)

令人费解的是,它甚至不会问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>,以防问题是IIS已经确定对应于物理文件夹的请求不符合managedHandler前提条件:

<modules runAllManagedModulesForAllRequests="true">
Run Code Online (Sandbox Code Playgroud)

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

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

Vic*_*tor 3

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

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

看一下MSDN页面不应用路由时的场景