【问题标题】:Response.write in application_error not working?application_error 中的 Response.write 不起作用?
【发布时间】:2013-12-02 02:59:09
【问题描述】:

好的,我有一个奇怪的问题,在网上找不到任何相关信息。我正在尝试在 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 页面,一切都按预期呈现。如果我从 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 从“sender”参数中提取 Response 对象),到移动 ClearError()Response.Clear() 等方法,等等。我也测试了 Response 对象的“null-ness”,它从不报告 null。我可以设置一些响应属性(http 状态代码),但不能设置其他属性。

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

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

【问题讨论】:

  • 开启自定义错误并设置默认错误页面。该页面将为您处理一切,您应该恢复所有功能。不要期望在应用程序级别有可用的会话/请求/响应上下文。
  • 我的一个要求是保留在浏览器中引发错误的原始 URL,因此我可以通过将 web.config 中的 redirectMode 设置为 ResponseRewrite 或执行 Server.Transfer 来执行您所说的操作在 Application_Error 中。但是,我希望不必诉诸于此(我希望在 Application_Error 本身中进行更多控制),但这是一个可能的选择。也就是说,为什么相同的代码(Response.Writes)在传输的 aspx 中有效,但在 Application_Error 中无效?我应该能够对传输方法进行逆向工程以使我的工作......

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


【解决方案1】:

使用这种方法处理未处理的异常。 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");
}

【讨论】:

  • 不幸的是,这没有抓住重点。当从简单的 aspx 页面抛出错误时,上述方法都有效。但是当从动态创建的自定义控件引发错误时,只有 Server.Transfer 方法有效。谢谢,但这无济于事。
猜你喜欢
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多