尽管在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;是默认值。
答案 0 :(得分:3)
您的问题是您正在捕获错误,然后重定向到错误页面,因此没有未处理的错误 - 意味着没有错误冒泡导致“黄色死亡屏幕”(这将是您将看到的mode="Off"
)。
当然,你不想要mode="Off"
生产,因为它很有启发性。 mode="RemoteOnly"
仅在本地使用YSOD,是首选方法。
要测试并查看YSOD,请在throw new Exception();
之后(在try / catch块之外)直接放置Page_Load
,然后在本地运行该页面。
由于您已经捕获了异常,因此可以进行某种错误处理,将错误详细信息(您要查找的内容)记录到数据库或文件中,以便您可以查看发生在您的网站上。虽然我当然不同意这种方法:
您显然正在捕捉意外例外情况,这意味着您不知道您的网站存在潜在问题,因为它们已被隐藏,
您必须在每个页面中放置错误处理/重定向。你不需要这样做。
相反,请考虑使用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=\"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>