IIS7在设置Response.StatusCode时覆盖customErrors?

Nic*_*s H 98 asp.net iis-7

这里有一个奇怪的问题.每个人都知道,如果您使用web.config的customErrors部分来创建自定义错误页面,那么您应该将其设置Response.StatusCode为适当的.例如,如果我创建一个自定义404页面并将其命名为404.aspx,我可以放入<% Response.StatusCode = 404 %>内容以使其具有真正的404状态标题.

到目前为止跟着我?好.现在尝试在IIS7上执行此操作.期间我无法上班.如果Response.StatusCode在自定义错误页面中设置,IIS7似乎完全覆盖自定义错误页面,并显示其自己的状态页面(如果您已配置一个.)

有没有其他人看到这种行为,也许还知道如何解决它?它在IIS6下工作,所以我不知道为什么会发生变化.

注意:这与ASP.NET自定义404返回200 OK而不是404 Not Found中的问题不同

Pav*_*uva 116

在system.webServer/httpErrors部分中将existingResponse设置为PassThrough:

  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>
Run Code Online (Sandbox Code Playgroud)

existingResponse属性的默认值为Auto:

Auto告诉自定义错误模块做正确的事情.客户端看到的实际错误文本将受到影响,具体取决于IHttpResponse::GetStatus调用中返回的fTrySkipCustomErrors的值.当fTrySkipCustomErrors设置为true时,自定义错误模块将允许响应通过,但如果将其设置为false,则自定义错误模块将使用其自己的文本替换文本.

更多信息:IIS7自定义错误模块可以带来什么

  • 请注意,将existingResponse设置为PassThrough可能会导致一些副作用.在进行任何更改之前,请掌握Pavel提供的链接. (3认同)
  • 尽管如此,我们有 HttpContext.Current.Response.TrySkipIisCustomErrors = true; 但这没有用。但是按照这个解决了我的问题。 (2认同)

Ric*_*ahl 80

使行为保持一致的最简单方法是清除错误并使用Response.TrySkipIisCustomErrors并将其设置为true.这将覆盖页面内的IIS全局错误页面处理或Application_Error中的全局错误处理程序.

Server.ClearError();
Response.TrySkipIisCustomErrors = true;
Run Code Online (Sandbox Code Playgroud)

通常,您应该在Application_Error处理程序中执行此操作,该处理程序处理应用程序错误处理程序未捕获的所有错误.

更多详细信息可以在这篇博文中找到:http: //www.west-wind.com/weblog/posts/745738.aspx

  • 不适合我.IIS7配置是纯粹的黑魔法. (34认同)
  • 这对我来说也不起作用(IIS8),并且建议似乎与OP不匹配(假设我正确读取它).我想要**在Web.config中配置的`customError`来触发.使用`Response.TrySkipIisCustomErrors = true`我得到相同的行为:显示丑陋的服务器生成的错误页面.将它设置为"false"没有任何反应 - 一个空白的浏览器窗口. (2认同)

Nic*_*s H 11

解决:事实证明,"详细错误"需要打开才能使IIS7"通过"您可能拥有的任何错误页面.见http://forums.iis.net/t/1146653.aspx