C# Response.write-in应用程序\错误不工作?

C# Response.write-in应用程序\错误不工作?,c#,asp.net,iis,error-handling,global-asax,C#,Asp.net,Iis,Error Handling,Global Asax,好的,我有一个奇怪的问题,在网上找不到任何关于它的信息。我正在尝试在ASP.NET中实现自定义应用程序级错误处理。我在web.config中关闭了customErrors,希望能够处理应用程序中的所有错误。请容忍我 我在global.asax中的代码非常简单: void Application_Error(Object sender, EventArgs e) { HttpContext.Current.Trace.Write("ERROR MESSAGE"); Response

好的,我有一个奇怪的问题,在网上找不到任何关于它的信息。我正在尝试在ASP.NET中实现自定义应用程序级错误处理。我在web.config中关闭了customErrors,希望能够处理应用程序中的所有错误。请容忍我

我在
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\u Init
page\u Load
中抛出了一个错误,所有操作都按预期进行,即:当出现错误时,我在空白页面上看到“错误消息”

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

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

因此,查看我的跟踪日志,在第二种情况下(动态添加的用户控件中的异常),我看到一个完整的控件树,错误发生在
开始渲染之后。在第一种情况下,树是空的,并且在Init或Load之后抛出错误。这两次,trace.axd都报告
未处理的执行错误

当我将控件内的抛出移动到控件的构造函数或
OnInit
时,事情按预期进行。当我将其移动到
OnLoad
Render
时,它会变傻

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

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


很明显,我正试图解开这个谜团,但我的目标是最终处理所有错误,不管它们在asp.net生命周期的哪个阶段发生,并且能够从处理程序中写出一些信息(即应用程序错误)

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

打开“自定义错误”并设置默认错误页。该页面将为您处理所有事情,您应该恢复所有功能。不要期望在应用程序级别上有可用的会话/请求/响应上下文。我的要求之一是在浏览器中保留引发错误的原始URL,这样我就可以按照您的要求将web.config中的重定向模式设置为ResponseWrite,或执行Server.Transfer in application\u错误。然而,我希望我不必求助于此(我希望在应用程序_错误本身中有更多的控制),但这是一个可能的选择。也就是说,为什么相同的代码(Response.Writes)可以在传输的aspx中工作,而不能在应用程序中工作?我应该能够逆向工程的转让方法,使我的工作…不幸的是,这类错过了重点。当从简单的aspx页面抛出错误时,上述方法都可以工作。但当从动态创建的自定义控件引发错误时,只有Server.Transfer方法有效。谢谢,但这没用。