为什么ASP.NET网站customErrors mode =“Off”不起作用

时间:2015-03-10 03:58:08

标签: c# asp.net iis web-config

尽管在web.config文件中添加了以下设置,但生产服务器(带有IIS7.5的Windows Server 2008 R2 64位)上的ASP.NET 4.0 Web应用程序未显示详细的错误消息:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <customErrors mode="Off"/>
    </system.web>
</configuration>

根据此MSDN article,我们应该收到详细的错误消息,但是我们收到的以下自定义错误消息显示在我们指向catch“{try/catch”块的错误页面上{1}}发生错误时:

  

应用程序遇到错误,请稍后再试。如果问题仍然存在,请联系系统管理员:.....“

我们还尝试this suggestion,但仍然在try/catch块上出现错误,显示上述消息。我们甚至重新启动了IIS以确保web.config更改得到应用但不是运气。我们已确保在web.config文件中不重复上述设置,并且应用程序中没有其他web.config文件。

修改 此外,我们在machine.config文件中没有<deployment ...>元素,这意味着根据此MSDN article<deployment retail="false"&gt;是默认值。

2 个答案:

答案 0 :(得分:3)

您的问题是您正在捕获错误,然后重定向到错误页面,因此没有未处理的错误 - 意味着没有错误冒泡导致“黄色死亡屏幕”(这将是您将看到的mode="Off")。

当然,你想要mode="Off"生产,因为它很有启发性。 mode="RemoteOnly"仅在本地使用YSOD,是首选方法。

要测试并查看YSOD,请在throw new Exception();之后(在try / catch块之外)直接放置Page_Load,然后在本地运行该页面。

由于您已经捕获了异常,因此可以进行某种错误处理,将错误详细信息(您要查找的内容)记录到数据库或文件中,以便您可以查看发生在您的网站上。虽然我当然不同意这种方法:

  1. 您显然正在捕捉意外例外情况,这意味着您不知道您的网站存在潜在问题,因为它们已被隐藏,

  2. 您必须在每个页面中放置错误处理/重定向。你不需要这样做。

  3. 相反,请考虑使用Elmah on NuGet并提供一种简单的方法来记录错误(或者您可以从global.ascx实现自己的自定义日志记录。)

    然后,停止捕获所有例外。只需捕获您期望发生的异常,并且不关心它们是否发生且不想记录(如转换时的FormatException)。 意外的异常现在会冒泡,由Elmah记录,然后您可以使用CustomErrors重定向/显示错误页面...而您不需要在实际页面上执行任何操作代码隐藏(这可以避免将错误处理放在每个页面的每个代码隐藏处)。 Elmah记录并让您随时查看YSOD。如果你选择这条路线,这比在global.ascx中滚动自己的错误处理容易得多,那么请确保你确保安全。

答案 1 :(得分:-5)

将来的某个时间,请在web.config中注释掉以下代码:

 <!--<system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>-->

更新以下代码。

<system.web>
    <authentication mode="None" />
    <compilation debug="true" targetFramework="4.6.1" /><!--Depends on your version of .Net--->
    <httpRuntime targetFramework="4.6.1" /><!-- Depends on your version of .Net--->
    <customErrors mode="Off"/> <!-- add this line--->
    <trust level="Full"/> <!-- add this line--->
</system.web>