簡體   English   中英

如何在ASP.NET應用程序中發送HTTP標頭時如何判斷?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM