C# 为什么ASP.NET网站自定义错误模式=“;关「;不起作用

C# 为什么ASP.NET网站自定义错误模式=“;关「;不起作用,c#,asp.net,iis,web-config,C#,Asp.net,Iis,Web Config,生产服务器上的ASP.NET 4.0 web应用程序(带IIS7.5的Windows server 2008 R2 64位)没有显示详细的错误消息,尽管在web.config文件中添加了以下设置: <?xml version="1.0"?> <configuration> <system.web> <customErrors mode="Off"/> </system.web> </configur

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

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

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

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

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

编辑
此外,我们在machine.config文件中没有
元素,这意味着根据这一点,
是默认值。

您的问题是,您正在捕获错误,然后重定向到错误页面,因此没有未处理的错误——这意味着没有出现导致“死亡黄屏”的错误(这是您将在
mode=“Off”
时看到的内容)

诚然,您不想在生产中使用
mode=“Off”
,因为这会泄露信息。
mode=“RemoteOnly”
只会在本地使用YSOD,这是首选方法

要测试和查看YSOD,请将
抛出新异常();
直接放在
页面加载之后(在try/catch块之外),然后在本地运行页面

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

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

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

  • 取而代之的是,考虑使用IIS,并提供一种简单的日志错误记录方法(或者您可以从<代码> Global .ASXX < /代码>中实现您自己的自定义日志记录)。


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

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

    
    
    将更新到以下代码

    
    
    是否能够呈现可读的错误消息取决于错误的性质。请参阅应用程序事件日志作为错误的附加源。@abatishchev,我已检查了服务器上的应用程序事件日志,但没有相关消息。try()中出现错误块的代码,然后它将转到catch()中阻止将用户重定向到自定义错误消息的位置。我们暂时不希望看到自定义错误消息,而是希望看到生产服务器上的实际错误消息,以便找到问题。@然后删除try/catch…或将错误记录到数据库/文件中,因为您已经在捕获它(看起来这应该已经是您正在做的事情了?).Try/catch不应该捕获意外错误(在我看来,就像只捕获
    异常
    ,而不是
    WebException
    FormatException
    或您期望发生的任何其他异常)…有点违背了目的,导致了类似这样的问题。@MikeSmithDev,这是否意味着如果在catch块中我们将用户重定向到自定义错误页,web.config中的设置将无效,并且错误将始终被重定向(从catch块)到我们的自定义错误页面-并且不会显示由ASP.NET生成的详细错误消息?@nam您是对的。我将尝试在回答中进一步解释。感谢您澄清自定义错误模式的使用以及已处理与未处理的错误。通读[自定义错误的MSDN定义]()我没有发现在customErrors模式的上下文中提到已处理和未处理的错误。在文章末尾阅读James Jardine的回复也让customErrors与ASP.NET Error在customErrors模式的上下文中有了一点明确。你为什么推荐这些呢?@mason这些事情需要发生:原因..那,以便修改您的应用程序以与GoDaddy的配置兼容。我不知道您为什么建议更改身份验证、自定义错误模式或应用程序是否在调试中编译。在盲目向其他人建议这些设置之前,您确实应该确切了解这些设置。我建议您删除您的设置回答这个问题,这样你就不会混淆任何人。是的,他们会混淆。而且你建议进行完全无关的更改,例如更改所使用的.NET版本。采取散漫的方法来解决问题是非常不负责任的。真的吗?那你为什么说“更新到下面的代码”,然后在代码中提供4.6.1?这些与