托管在IIS7上的ASP.NET应用程序无视自定义错误并退回到IIS错误

12

我有一个使用路由来处理URL的C# Web Forms ASP.NET 4.0 Web应用程序,但某些原因导致系统.web部分中定义的自定义错误完全被忽略,并且会回退到IIS错误。

这个自定义错误完全被忽略了。

  <system.web>
    <customErrors mode="On">
      <error statusCode="500" redirect="~/Error" />
      <error statusCode="404" redirect="~/404" />
      <error statusCode="403" redirect="~/Error" />
    </customErrors>
  </system.web>

这部分开始接管

  <system.webServer>
    <httpErrors>
      <!--<clear />-->
      <remove statusCode="500" subStatusCode="-1" />
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" subStatusCode="-1" path="/App1/404" responseMode="Redirect" />
      <error statusCode="500" prefixLanguageFilePath="" path="/App1/Error" responseMode="Redirect" />
    </httpErrors>
  </system.webServer>
这只是一个小的不便,但它会完全回避我的应用程序,而是转向IIS本地,从而无法正确记录我的404异常,这对Elmah造成了影响。 编辑: 为了避免任何建议,我只在customErrors停止工作后添加了httpErrors配置,以便我有任何东西可做。

2
我也无法让它正常工作。对于404错误,似乎有一个常见的解决方法是使用“通配符路由”,如此处所提出的:https://dev59.com/gXE85IYBdhLWcg3wl0nF。我还注意到,当您输入以“.aspx”结尾的错误网址时,自定义404页面会启动。但是,如果我省略扩展名,我将被重定向到IIS的默认错误页面,就像您所描述的那样。而且,我绝对不知道如何使其他错误的自定义错误页面正常工作,而不仅仅是404错误。我很好奇您的问题最终会得出什么答案。 - Slauma
我很高兴听到别人也遇到了这个问题,因为在我意识到如何配置httpErrors之前,我几乎束手无策。 - Chris Marisic
你是否设置了忽略错误和404的路由? - bleevo
这个内容在MVC概述教程中有所讨论。IIS错误的行为取决于您使用的IIS版本。使用不同版本的IIS(C#)与ASP.NET MVC一起使用 - Philip Smith
不要觉得这与问题无关,我正在使用集成模式下的IIS 7+。 - Chris Marisic
3个回答

14

要禁用IIS错误信息,您需要设置

  Response.TrySkipIisCustomErrors = true;

在您的错误页面中添加这些代码。之后,您的错误消息应该能够正常显示。


这是我最初搜索后看起来最有成果的,我现在正在尝试。Rick Strahl关于这个主题的好文章:http://www.west-wind.com/weblog/posts/745738.aspx - Chris Marisic

11

不要使用:

Response.TrySkipIisCustomErrors = true;

在 Web.config 中使用以下内容:

<httpErrors errorMode="Custom" existingResponse="Replace">

2
实际上我必须使用existingResponse="PassThrough"。 - Bart Calixto

3
您可以通过两种方式跳过IIS7默认的错误消息,一种方法是设置 response.TrySkipIisCustomErrors = true。
response.TrySkipIisCustomErrors = true;
response.Status = response.Status;

如果您没有设置response.Status,试图跳过IIS自定义错误页面(TrySkipIisCustomErrors)可能不会生效。

另一种方法是在web.config中将existingResponse设置为“PassThrough”。

<configuration>
  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>
</configuration>

但这将忽略所有设置的IIS自定义错误页面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接