长话短说,我有一个我正在尝试调试的ASP.NET应用程序,在某些情况下,在非常特殊的情况下,应用程序会在Response.Redirect()
处抛出异常,说明:
"Cannot redirect after HTTP headers have been sent."
我或多或少得到了,除了我无法弄清哪里标题被发送。
在ASP.NET应用程序中是否需要查找指示已发送HTTP标头的内容?
BONUS DIFFICULTY: ASP.NET应用程序仍在.NET 1.1中。关于升级延迟的情况是一个非常痛苦的主题。
答案 0 :(得分:16)
HttpApplication
有一个事件PreSendRequestHeaders
,只有在标题写入时才会调用。订阅并登录或添加断点。
除此之外,HttpResponse
在.NET 1.1中有一个名为HeadersWritten
(_headersWritten
字段的内部属性。由于它是内部的,你不能直接访问它,但你可以通过反射。如果这仅用于内部调试(即非生产代码),则可以使用反射。
在所有页面生命周期事件之前/之后检查此方法。一旦您知道哪个事件正在写出标题,请添加更多HeadersWritten
个检查以找出它们写入的位置。通过逐步缩小对该房产的支票,您将找到它。
新信息
HeadersWritten
属性是从.Net 4.5.2
答案 1 :(得分:5)
Samuel的回复刚刚为我解决了这个问题(+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);
}