2010-03-04 44 views
14

長話短說,我有我試圖調試,並在某些時候,在非常特殊的情況下,ASP.NET應用程序,該應用程序將引發在Response.Redirect()異常,指出:如何知道HTTP頭文件在ASP.NET應用程序中發送的時間?

"Cannot redirect after HTTP headers have been sent." 

哪個更我還是少得到,除了我不知道哪裏標題發送。

在ASP.NET應用程序中是否有需要查找的東西,它會指示HTTP標頭已發送?

BONUS DIFFICULTY: ASP.NET應用程序仍在.NET 1.1中。關於升級後延遲的情況真的很痛苦。

+0

響應緩衝('Response.Buffer' - 你想要這個on)和響應法拉盛('Response.Flush()' - 你不不想這樣做)是兩個明顯的候選人。 – bzlm 2010-03-04 19:27:29

回答

15

HttpApplication有一個事件PreSendRequestHeaders這是剛剛寫入標題時調用。訂閱並記錄或添加斷點。

除此之外,HttpResponse具有內部屬性稱爲HeadersWritten(在.NET 1.1 _headersWritten字段)。由於它是內部的,你不能直接訪問它,但你可以通過反思。如果這僅用於內部調試(即不是生產代碼),則可以使用反射。

在所有頁面生命週期事件之前/之後檢查此方法。一旦您知道哪個事件正在寫出標題,請添加更多HeadersWritten檢查以查明它們正在寫入的位置。通過逐步縮小支票到這個屬性,你會發現它。

新信息

HeadersWritten屬性是公共起價淨4.5.2

+0

這看起來非常好...除了我忘了提及應用程序是在.NET 1.1中,這看起來是一個.NET 2.0+解決方案。 – 2010-03-04 20:16:24

+0

@Schnapple,.NET 1.1真的很舊。每當您談論舊版本時,您都應該指定版本。在.NET 1.1中,只有一個專用字段「_headersWritten」,您可以通過反射來閱讀。 – 2010-03-04 20:27:15

+2

'HeadersWritten'屬性公開自.Net 4.5.2 – 2017-01-24 21:52:13

5

薩穆埃爾的答覆只是解決了這個問題對我來說(+1)。我不能粘貼在註釋代碼示例,但在幫助他人的利益,這裏是我如何使用他建議到HeadersWritten屬性添加到我的IHttpHandler事件:

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); 
} 
+4

請注意,每個「HttpApplication」對象的實例可能會服務多個(但始終是順序)請求,因此您必須*在BeginRequest事件期間重置該標誌。這也適用於具有「IsReusable」屬性返回true的'HTTPHandler'。請參閱[HttpApplication](http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx)和[IsResuable](http://msdn.microsoft.com/en-us/library/ system.web.ihttphandler.isreusable。aspx)在MSDN中的詳細信息。 – 2013-07-08 21:08:23

+0

謝謝你,歐元。爲了清楚起見,我將這個屬性和相關的代碼&事件添加到從IHttpHandler繼承的我的類中。我的理解是這個班級應該一次性用於這個請求,因此完全不受其他請求的干擾。如果這種理解不正確,請讓我知道! – 2013-07-09 22:30:40

+0

IHttpHandler接口的成員之一是一個名爲'IsReusable'的屬性(我在原始評論中拼錯了它)。如果你的實現本質上是'public bool IsReusable {get {return false; }},那麼你很好:ASP.NET將爲每個請求實例化一個對象,然後將其扔掉。如果你返回'true',那麼ASP.NET將重用你的實例來處理多個請求,並且你不是線程安全的。 – 2013-07-10 00:34:36

相關問題