ASP.NET UpdatePanel超时和500个自定义错误错误

时间:2011-09-23 00:24:45

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

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

以下是我的问题:

  1. 此500错误页面中没有任何内容 Server.GetLastError()用于这些超时方案。这是一个 预期的行为?
  2. 可以更改,因此我可以访问这些超时 Server.GetLastError()或者也许只是通过“LogEvent”机制运行这个错误?
  3. 有没有更好/更优雅的方式来处理这个问题?
  4. 下面是我的代码,为您提供一个想法,而不是我在我的应用程序中的确切内容,但非常接近。

    的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
    

1 个答案:

答案 0 :(得分:0)

是的,服务器错误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错误消息。当Web服务器而不是应用程序发生错误时,通常会知道错误500。因此,不建议为重定向提供错误500,这会使Web管理员和开发人员感到困惑。

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

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