![](/img/trans.png)
[英]ASP.NET 3.5, googlebot, 301 Redirect “Cannot redirect after HTTP headers have been sent”
[英]How can I tell when HTTP Headers have been sent in an ASP.NET application?
簡而言之,我有一個ASP.NET應用程序,我正在嘗試調試,在某些情況下,在非常特殊的情況下,應用程序將在Response.Redirect()
處拋出異常,說明:
"Cannot redirect after HTTP headers have been sent."
我或多或少得到,但我無法揣摩出頭被送到。
是否有一些東西要在ASP.NET應用程序中查找,表明HTTP標頭已被發送?
獎金難度: ASP.NET應用程序仍在.NET 1.1中。 關於升級延遲的情況是一個非常痛苦的主題。
HttpApplication
有一個事件PreSendRequestHeaders
,只有當頭文件被寫入時才會調用它。 訂閱此並記錄或添加斷點。
除此之外, HttpResponse
有一個名為HeadersWritten
的內部屬性(.NET 1.1中的_headersWritten
字段)。 由於它是內部的,你不能直接訪問它,但你可以通過反射。 如果這僅用於內部調試(即非生產代碼),那么使用反射就可以了。
在所有頁面生命周期事件之前/之后檢查此方法。 一旦知道哪個事件正在寫出標題,添加更多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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.