【发布时间】:2011-11-23 07:01:38
【问题描述】:
我有一个 .net 应用程序,它使用 customerrors web.config 模块来显示有意义的错误消息。对于由非 ajax 和 ajax 组件(更新面板)引起的 500 个错误/异常,它没有任何问题。但是,在 updatepanel 的异步请求超时的情况下,根本不会引发任何错误。我能够在 firebug 中看到超时并提出一个解决方案,该解决方案至少将错误消息显示为警报,然后使用 javascript 将用户重定向到 500 错误页面,但它并没有完全完成应用程序的其余部分所做的事情如果出现此类未处理的错误。我基本上只是希望一切都通过“LogEvent”机制,所以根据错误的严重程度,它会做必要的工作。
这是我的问题:
- 这个 500 错误页面在 Server.GetLastError() 用于这些超时场景。这是一个 预期的行为?
- 是否可以更改,以便我可以访问这些超时 Server.GetLastError() 或者只是通过“LogEvent”机制运行这个错误?
- 是否有更好/更优雅的方式来处理此问题?
下面是我的代码,可以让您了解一下,与我的应用程序中的代码不完全一样,但非常接近。
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