【问题标题】:ASP.NET UpdatePanel Timeout and 500 errors with custom errorsASP.NET UpdatePanel 超时和 500 错误与自定义错误
【发布时间】:2011-11-23 07:01:38
【问题描述】:

我有一个 .net 应用程序,它使用 customerrors web.config 模块来显示有意义的错误消息。对于由非 ajax 和 ajax 组件(更新面板)引起的 500 个错误/异常,它没有任何问题。但是,在 updatepanel 的异步请求超时的情况下,根本不会引发任何错误。我能够在 firebug 中看到超时并提出一个解决方案,该解决方案至少将错误消息显示为警报,然后使用 javascript 将用户重定向到 500 错误页面,但它并没有完全完成应用程序的其余部分所做的事情如果出现此类未处理的错误。我基本上只是希望一切都通过“LogEvent”机制,所以根据错误的严重程度,它会做必要的工作。

这是我的问题:

  1. 这个 500 错误页面在 Server.GetLastError() 用于这些超时场景。这是一个 预期的行为?
  2. 是否可以更改,以便我可以访问这些超时 Server.GetLastError() 或者只是通过“LogEvent”机制运行这个错误?
  3. 是否有更好/更优雅的方式来处理此问题?

下面是我的代码,可以让您了解一下,与我的应用程序中的代码不完全一样,但非常接近。

Web.Config

<customErrors mode="On" defaultRedirect="~/Errors/ErrorUnknown.aspx" redirectMode="ResponseRewrite">
  <error statusCode="500" redirect="~/Errors/Error500.aspx" />
</customErrors>

Error500.aspx.vb

Dim lastException As Exception = Server.GetLastError()

If lastException IsNot Nothing Then LogEvent(LogLevel.Error, "UnHandled Error From 500 Error Page.", lastException)

LblErrorMessage.Text = "Unknown error occured when processing your request."

Session.Abandon()

带有 UpdatePanel ASPX 的页面

<asp:ScriptManager ID="AppScriptManager" AsyncPostBackTimeout="3" runat="server" AllowCustomErrorsRedirect="True" OnAsyncPostBackError="AppAsyncPostBackError" AsyncPostBackErrorMessage="There was an error processing your request!" />

带有 UpdatePanel ASPX 的页面上的 Javascript

<script type="text/javascript" language="javascript">
    $(document).ready(function () {
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
    });
    function endRequestHandler(sender, args) {
        if (args.get_error() != undefined) {
            var errorMessage = "There was an error processing your request!";
            errorMessage += '\nError message: ' + args.get_error().message;
            args.set_errorHandled(true);
            alert(errorMessage);
            window.location.replace('Errors/Error500.aspx');
        }
    }        
</script>

带有 UpdatePanel ASPX.VB 的页面

Public Sub AppAsyncPostBackError(sender As Object, e As System.Web.UI.AsyncPostBackErrorEventArgs) Handles AppScriptManager.AsyncPostBackError

    LogEvent(LogLevel.Fatal, "Asyncpostback error from update panel.", e.Exception)

End Sub

使用 NLog 记录事件的功能

Private Sub LogEvent(level As LogLevel, logMessage As String, exception As Exception, ParamArray args() As Object)

    Try

        Dim appLogger As Logger = LogManager.GetCurrentClassLogger()

        If exception IsNot Nothing Then

            '# If it's an exception store it in a seperate file as fatal exception
            appLogger.LogException(level, String.Format(logMessage, args), exception)

            '# send an email
            SendErrorEmail(String.Format(logMessage, args), exception)

            '# Throw Exception as this was fatal
            If level = LogLevel.Fatal Then Throw

        Else

            '# Log the message
            appLogger.Log(level, logMessage, args)

        End If

    Catch ex As Exception

    End Try

End Sub

【问题讨论】:

    标签: asp.net vb.net asp.net-ajax updatepanel


    【解决方案1】:

    是的,服务器错误 500 与 Web 服务器有关。

    从 Microsoft 阅读此知识库: "How Web site administrators can troubleshoot an "HTTP 500 - Internal Server Error" error message on IIS 4.0 or on IIS 5.0"

    请不要搞乱 HTTP 错误消息。错误 500 通常在 Web 服务器发生错误时才知道,而不是应用程序。因此,不建议为您的重定向提供错误 500,这会使 Web 管理员和开发人员感到困惑。

    这就是原因:"Description of Hypertext Transport Protocol error messages"

    处理此问题的最佳选择是使用Log4Net (log for .NET) 中的日志记录机制,或使用Microsoft's Enterprise Library 5.0 中的日志记录机制。在此之前,您可以使用自定义错误/异常页面,但不处理错误 500。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2015-11-18
      • 2011-01-23
      • 1970-01-01
      相关资源
      最近更新 更多