我想知道在通过HttpApplication.Error事件处理错误后,ASP.NET请求生命周期的哪些部分发生了。具体来说,http://msdn.microsoft.com/en-us/library/bb470252.aspx#Stages列出的哪些事件在发生错误后会触发?我知道EndRequest仍然会触发,我怀疑PreSendRequestHeaders和PreSendRequestContent也会激活,但除此之外我不知道。
是否取决于生命周期中何时发生错误?是否依赖于我是否在错误处理程序中调用Server.ClearError()?
我问这个问题,因为我不知道是否应该从我的错误处理程序中调用HttpApplication.CompleteRequest()。
答案 0 :(得分:3)
最好的方法是捕获服务器上次错误和 appdomain例外。
所有这些都可以在Global.asax.cs文件中完成。
检查以下步骤:
1-在Global.asax.cs中,捕获最后一个错误并记录下来。
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Server.ClearError();
log.Error("Application Error caught in Global ", exception);
}
2-在AppDomain上为UnhandledException事件添加事件处理程序,这应该添加到Application_Start:
protected void Application_Start(object sender, EventArgs e)
{
//....
AppDomain.CurrentDomain.UnhandledException
+= new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
3-这是CurrentDomain_UnhandledException的实现:
void CurrentDomain_UnhandledException(object sender,
UnhandledExceptionEventArgs e)
{
if (e != null)
log.Error("Domain Unhandled Exception: ", e.ExceptionObject as Exception);
}
快乐编码:)
答案 1 :(得分:0)
即使发生错误,也会引发LogRequest事件。您可以为LogRequest事件提供事件处理程序,以便为请求提供自定义日志记录。 有关http://msdn.microsoft.com/en-us/library/system.web.httpapplication.logrequest.aspx
的更多详情如果您的应用程序生成自定义错误输出,请通过调用HttpApplication.Error事件中的ClearError方法来禁止ASP.NET生成的默认错误消息。
答案 2 :(得分:0)
我没有检查,但我认为这取决于。
任何页面事件(Init / Load / PreRender)都可能出现错误。 引发错误后,如果清除错误,页面生命周期将从原来的位置继续。
答案 3 :(得分:0)
可以通过调用GetLastError方法来访问引发Error事件的异常。如果您的应用程序生成自定义错误输出,请通过调用ClearError方法来禁止ASP.NET生成的默认错误消息。
答案 4 :(得分:0)
void Application_Error(Object sender, EventArgs e)
global.asax
中的
http://msdn.microsoft.com/en-us/library/24395wz3%28v=vs.100%29.aspx
http://msdn.microsoft.com/en-us/library/fwzzh56s%28v=vs.100%29.aspx