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 ?