当通过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?
答案 0 :(得分:3)
当找到与路径具有相同URL的物理文件或文件夹时,路由将不处理请求,并且将提供物理文件。
通过您可以通过将 RouteExolil 对象中的 RouteExistingFiles 属性设置为 true 来更改此行为。