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

sgtfey8w  于 2022-11-12  发布在  .NET
关注(0)|答案(3)|浏览(272)

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

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

根据这个MSDN article,我们应该得到详细的错误消息,但是我们得到了下面的自定义错误消息,它显示在错误页面上,当错误发生时,我们在try/catch的“catch“块中定向到该错误页面:
应用程序遇到错误,请稍后重试。如果问题仍然存在,请通过以下方式与系统管理员联系:.....”
我们也尝试了this suggestion,但仍然在try/catch块上出现错误,显示了上述消息。我们甚至重新启动了IIS,以确保应用了web.config更改,但运气不佳。我们已确保web.config文件中没有重复上述设置,并且应用程序中没有其他web.config文件。

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

bfnvny8b

bfnvny8b1#

您的问题是您捕获了错误,然后重定向到错误页面,因此没有未处理的错误-a这意味着没有错误冒泡导致“黄屏死机”(这是您在mode="Off"时将看到的)。
当然,您希望在生产中使用mode="Off",因为它很有启发性。mode="RemoteOnly"只会在本地使用YSOD,是首选方法。
要测试并查看YSOD,请将throw new Exception();直接放在Page_Load之后(在try/catch块之外),然后在本地运行该页。
既然你已经捕捉到了异常,你 * 可以 * 有某种错误处理,将错误细节(你正在寻找的)记录到数据库或文件中,这样你就可以检查你的网站发生了什么。虽然我不太同意这种方法,因为这样:
1.您显然正在捕获 * 意外 * 异常,这意味着您没有意识到您的站点的潜在问题,因为它们被隐藏起来了,并且
1.你必须在每一个页面中放置错误处理/重定向。你不需要这样做。
相反,考虑使用Elmah,它是on NuGet,提供了一种记录错误的简单方法(或者您可以从global.ascx实现您自己的自定义日志记录)。
然后,停止捕获所有异常,只捕获您希望发生的异常,而不关心它们是否发生,也不想记录(就像转换中的FormatException)。* 意外 * 异常现在将出现,由Elmah记录,然后您可以使用CustomErrors来重定向/显示错误页面...并且您不需要在实际页面的代码后面执行任何这些操作(这样你就不用把错误处理放在每个页面的每个代码后面)Elmah记录日志,并让你随时查看YSOD。如果你走这条路,这比在global.ascx中滚动你自己的错误处理要容易得多,只要确保你保护了elmah。

cld4siwp

cld4siwp2#

对于在IIS中运行.NET(Core)应用程序时遇到此问题的任何人,您可以改为通过设置stdoutLogEnabled=“true”和stdoutLogFile=“C:\Users\SomeUser\LoggingDirectory\LogFileName”将异常的输出发送到日志文件。在这种情况下,您将获得一个名为LogFileName_20220607193533_9648.txt的日志文件。
确保重置IIS。

<configuration>
  <system.web>
    <customErrors mode="Off" />
  </system.web>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\Project.Name.dll" stdoutLogEnabled="true" stdoutLogFile="C:\Users\SomeUser\LoggingDirectory\LogFileName" hostingModel="OutOfProcess" />
    </system.webServer>
  </location>
</configuration>

免责声明:我不确定你是否需要“customErrors mode='Off'”部分,但是,当这个解决方案为我工作时,它就在那里。

utugiqy6

utugiqy63#

在将来某个时候,注解掉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>

相关问题