application_error中的Response.write不起作用?

时间:2013-11-18 19:56:06

标签: c# asp.net iis error-handling global-asax

好的,我有一个奇怪的问题,无法在线找到任何相关信息。我试图在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中引发了错误,一切都按预期工作,即:我看到"错误消息"发生错误时在空白页面上。

现在我动态地将一些用户控件添加到该aspx页面,所有内容都按预期呈现。如果我然后从INSIDE其中一个控件中抛出错误,我只会得到一个空白页面。 "错误消息"没有出现。

现在我知道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.Response vs将Response对象从" sender"参数中拉出)到移动ClearError()Response.Clear()等方法等我已经测试了响应对象" null-ness"同样,它永远不会报告null。我可以设置一些响应属性(http状态代码),但不能设置其他属性。

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

显然,我试图解决这个谜团,但我的目标是最终处理所有错误,无论它们发生在asp.net生命周期的哪一点,并且能够从中写出一些信息处理程序(即application_error)。

1 个答案:

答案 0 :(得分:1)

使用此方法处理未处理的expcptions。 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");
}