application_error中的Response.write不起作用



好吧,我有一个奇怪的问题,在网上找不到任何关于它的信息。我正在尝试让自定义应用程序级错误处理在ASP.NET中工作。我在web.config中关闭了customErrors,希望能处理application_error中的所有内容。请耐心等待…

我在global.asax中的代码非常简单:

void Application_Error(Object sender, EventArgs e) {
    HttpContext.Current.Trace.Write("ERROR MESSAGE");
    Response.TrySkipIisCustomErrors = true;
    var error = Server.GetLastError();
    HttpContext.Current.Response.Write("ERROR MESSAGE");
    HttpContext.Current.ClearError();
}

我创建了一个简单的aspx页面,并在Page_InitPage_Load中引发了一个错误,一切都如预期的那样进行,即:当出现错误时,我在空白页面上看到"error MESSAGE"。

现在,我动态地将一些用户控件添加到aspx页面中,所有内容都会按预期呈现。如果我从其中一个控件的内部抛出一个错误,我只会得到一个空白的白色页面。"ERROR MESSAGE"(错误消息)未出现。

现在我知道application_error仍在启动,因为当我删除对ClearError()的调用时,我会得到一个死亡黄屏。此外,我可以在那里执行Server.Transfer,这很好。但Response.Write不会有任何结果。更进一步:我可以设置Response.StatusCode,但Response.Redirect会出错(从而使我陷入无限循环)。尝试写入事件日志也会出错,但当我尝试将字符串转换为数字时,它不会抛出新错误,而是抛出原始错误,即:"输入字符串的格式不正确。"。如前所述,Response.Write不会执行任何操作,尽管它不会抛出错误。

因此,查看我的跟踪日志,在第二种情况下(动态添加的用户控件中出现异常),我看到了一个完整的控件树,错误发生在Begin Render之后。在第一种情况下,树为空,并且在Init或Load之后抛出错误。两次,trace.axd都报告Unhandled Execution Error

当我将控件内部的throw移动到控件的构造函数或OnInit时,事情会按预期进行。当我把它移到OnLoadRender时,它会变得很愚蠢。

所以我想知道Response对象是否在某个时刻失去了某些功能。我尝试了各种各样的排列,从语法(使用HttpContext.Current.Response vs Context.Responset vs从"sender"参数中提取Response对象),到移动ClearError()Response.Clear()等方法,等等。我也测试了Response对象的"null ness",它从不报告null。我可以设置一些响应属性(http状态代码),但不能设置其他属性。

我使用的是IIS7.5集成模式(.NET v4),但在尝试经典模式时遇到了类似的问题。

因此,很明显,我正在努力解开这个谜团,但我的目标是最终处理所有错误,无论它们在asp.net生命周期的哪个阶段发生,并能够从处理程序中写出一些信息(即application_error)。

使用此方法处理未处理的异常。web.config中的自定义错误已关闭。

所有3个选项都有效。

void Application_Error(object sender, EventArgs e)
{
  // Code that runs when an unhandled error occurs
  Response.TrySkipIisCustomErrors = true;
  this.Server.ClearError();
  
  this.Server.GetLastError();
 //DO SOMETHING WITH GetLastError() may be redirect to different pages based on type of error
  //Option 1:
  Response.Write("Error");
    
  //Option 2:
  Response.Redirect("~/Error.aspx");
  //Option 3:
  this.Server.Transfer("~/Error.aspx");
}

最新更新