为什么 ASP.NET 网站 customErrors mode="Off" 不工作

Why ASP.NET website customErrors mode="Off" not working

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

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

根据这个 MSDN article,我们应该得到详细的错误消息,但我们得到了以下自定义错误消息,它显示在我们在“catch”块中指向的错误页面上发生错误时 try/catch

Application has encounter an error, please try again later. If the problem persists please contact the system admin at: ....."

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

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

你的问题是你正在捕获错误然后重定向到错误页面,所以没有未处理的错误——这意味着没有错误冒泡导致 "Yellow Screen Of Death"(这就是你将看到的当 mode="Off").

当然,您想要mode="Off"投入生产,因为它很暴露。 mode="RemoteOnly" 只会在本地进行 YSOD,这是首选方法。

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

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

  1. 您显然正在捕获 意外 异常,这意味着您没有意识到您网站的潜在问题,因为它们被隐藏了,并且

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

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

然后,停止捕获所有 异常。只捕获您 期望 发生的异常并且不关心它们发生并且不想记录(如转换中的 FormatException)。 意外 异常现在会冒出来,由 Elmah 记录,然后您可以使用 CustomErrors 到 redirect/display 错误页面...您不需要执行任何操作这在实际页面的代码隐藏上(这样可以避免将错误处理放在每个页面的每个代码隐藏上)。 Elmah 记录并让您随时查看 YSOD。如果你走这条路,这比在 global.ascx 中滚动你自己的错误处理要容易得多,只要确保你保护 elmah。

以后的某个时候,注释掉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>