这个问题发布于堆栈溢出,我在这里交叉发布是因为我认为这里可能是一个更正确的论坛。
我在尝试完全通过编程控制 IIS7(集成模式)中错误的呈现时遇到了很大的麻烦。我想要做的是给出一个错误(未找到页面、内部服务器错误、未通过身份验证等),将整个请求传输到自定义 ASPX 或 HTML(我更喜欢后者),并带有正确的 HTTP 状态代码。
我希望 IIS7 不关心我将 HTTP 状态代码设置为什么。我不需要它的错误处理。当我设置时Response.StatusCode = (int)HttpStatusCode.NotFound
,我希望 IIS 不会呈现自己的错误页面,但也许会将请求转移到另一个文件。
我已经让这个静态配置工作起来了:
<configuration>
<system.webServer>
<httpErrors>
<clear />
<error statusCode="404" path="/errors/404.html" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</configuration>
虽然这有效,但在出现错误的情况下,它无法让我通过编程控制如何处理响应。配置是一个很好的后备方案,但我真的希望能够在某些情况下设置Response.StatusCode
和呈现与配置完全不同的东西404.html
(例如,如果我们收到 JSON 响应Accept: application/json
),但 IIS7 不允许我这样做。没有机会。
那我该怎么办呢?我尝试设置HttpResponse.TrySkipIisCustomErrors Property
,但这看起来像是一个巨大的黑客行为,而且似乎无法持续发挥作用。将此属性设置为 true 真的是获得我想要的行为的推荐最佳实践吗?
目前,我唯一剩下的感觉就是对 IIS7 的强烈仇恨。有人能帮我解决这个问题吗,证明我只是愚蠢,而且我确实可以完全控制 HTTP 堆栈?
答案1
实现此目的的方法是设置 %windir%\system32\inetsrv\applicationHost.config 中的部分,以便由基本页面处理程序工厂处理未找到的页面。如果您查看 .aspx 的处理程序,只需复制它并将其设置为通配符文件处理程序。
我相信情况会是这样的:
<add name="Catch-all" path="*" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" />
让其覆盖底部的 StaticFile 规则。