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

时间:2010-03-04 19:25:15

标签: c# asp.net http-headers

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

"Cannot redirect after HTTP headers have been sent."

我或多或少得到了,除了我无法弄清哪里标题被发送。

在ASP.NET应用程序中是否需要查找指示已发送HTTP标头的内容?

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

2 个答案:

答案 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);
}