如何在ASP.NET应用程序中发送HTTP标头时如何判断?

长话短说,我有一个ASP.NET应用程序,我正在尝试调试,在某些情况下,在非常特殊的情况下,应用程序将在Response.Redirect()处抛出exception,说明:

 "Cannot redirect after HTTP headers have been sent." 

我或多或少得到了,除了我无法弄清楚标题的发送位置。

是否有一些东西要在ASP.NET应用程序中查找,表明HTTP标头已被发送?

奖金难度: ASP.NET应用程序仍在.NET 1.1中。 关于升级延迟的情况是一个非常痛苦的主题。

HttpApplication有一个事件PreSendRequestHeaders ,只有当头文件被写入时才会调用它。 订阅此并记录或添加断点。

除此之外, HttpResponse还有一个名为HeadersWritten内部属性(.NET 1.1中的_headersWritten字段)。 由于它是内部的,你不能直接访问它,但你可以通过reflection。 如果这仅用于内部调试(即,不是生产代码),那么使用reflection就可以了。

在所有页面生命周期事件之前/之后检查此方法。 一旦知道哪个事件正在写出标题,就添加更多HeadersWritten检查以找出它们写入的位置。 通过逐步缩小对该物业的支票,你会发现它。

新信息

HeadersWritten属性是从.Net 4.5.2开始公开的

塞缪尔的回答刚刚为我解决了这个问题(+1)。 我不能在评论中粘贴代码示例,但为了帮助其他人,这里我是如何使用他建议的事件向我的IHTTPHandler添加HeadersWritten属性:

 protected bool HeadersWritten { get; private set; } void ApplicationInstance_BeginRequest(object sender, EventArgs e) { HeadersWritten = false; } void ApplicationInstance_PreSendRequestHeaders(object sender, EventArgs e) { HeadersWritten = true; } public void ProcessRequest(HttpContextBase context) { context.ApplicationInstance.PreSendRequestHeaders += new EventHandler(ApplicationInstance_PreSendRequestHeaders); do_some_stuff(); } 

在我的代码中,如果我把标题搞得太晚会破坏,我只需先检查HeadersWritten属性:

 if (!HeadersWritten) { Context.Response.StatusDescription = get_custom_description(Context.Response.StatusCode); }