为什么 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 块之外),然后在本地 运行 页面。
由于您已经捕获了异常,您可以进行某种错误处理,将错误详细信息(您正在查找的内容)记录到数据库或文件中,以便您可以检查您的网站发生了什么。虽然我不太同意这种方法因为那时:
您显然正在捕获 意外 异常,这意味着您没有意识到您网站的潜在问题,因为它们被隐藏了,并且
您必须在每个页面中放置错误处理/重定向。你不需要这样做。
相反,请考虑使用 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=\"Web\" /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>
我们在生产服务器(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 块之外),然后在本地 运行 页面。
由于您已经捕获了异常,您可以进行某种错误处理,将错误详细信息(您正在查找的内容)记录到数据库或文件中,以便您可以检查您的网站发生了什么。虽然我不太同意这种方法因为那时:
您显然正在捕获 意外 异常,这意味着您没有意识到您网站的潜在问题,因为它们被隐藏了,并且
您必须在每个页面中放置错误处理/重定向。你不需要这样做。
相反,请考虑使用 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=\"Web\" /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>