2010-09-21 35 views
10

我正在向頁面添加頭文件,如下所示: Page.Response.AddHeader(「foo」,「bar」);檢測已發送的asp.net http頭文件

根據之前的處理,有時這會失敗,並且「服務器無法在發送HTTP標頭後添加標頭」。我通過封入Page.Response.AddHeader(「foo」,「bar」)來處理這個問題。在try-catch構造中。但是,爲了保持清潔並避免生成異常,是否有任何方法可以檢測到頭文件已經發送? (順便說一句,如果我嘗試評估Page.Response.Headers然後我得到了以下錯誤:「此操作需要IIS綜合管道模式」)

感謝

+0

用於緩存使用Page.Response.Cache – gandjustas 2010-09-21 08:01:52

+0

我以前見過這個。您需要解釋您使用的是什麼技術:緩存,AJAX,MVC,...以及您在代碼中添加此標頭的位置,以便我們提供幫助。 – Aliostad 2010-09-21 08:34:26

回答

6

不幸的是,雖然HttpResponse對象有一個名爲HeadersWritten財產,並呼籲_headersWritten支持字段,這些都不是從System.Web程序集的外部訪問 - 除非你使用反射。我不清楚你認爲你能從Headers集合中獲得什麼,它可能存在也可能不存在,而不管標頭是否已經發送。

如果您想使用反射,它可能會有它自己的性能損失,並且它會要求您的應用程序以完全信任的方式運行。

HttpResponse上涉及_headersWritten字段的所有可公開訪問的方法似乎都使用它來引發異常。

+0

+1良好的觀察。我認爲我的工作是我所建議的。 – Aliostad 2010-09-21 11:12:13

+0

與此同時[.Net自Framework 4.5.2開始使HeadersWritten公開](https://stackoverflow.com/a/36206613/2418006) – OneManBand 2017-10-20 23:35:22

13

您可以使用HttpModule註冊PreSendRequestHeaders事件。當它被調用時,向HttpContext.Current.Items寫一個值,指示頭文件正在發送 - 然後在代碼中的任何其他位置檢查HttpContext.Current.Items中的值,以查看它是否已發送。

+0

看起來這可能解決了我們遇到的同樣問題。謝謝! – anthonyv 2013-01-03 21:16:06

+2

如果你能夠切換到.NET 4.5.2,你應該使用'HttpResponseBase.AddOnSendingHeaders'。 [鏈接](http://msdn.microsoft.com/en-us/library/system.web.httpresponsebase.addonsendingheaders.aspx) – drphrozen 2014-05-27 05:57:50

6

由於.NET 4.5.2的,你可以做到這一點使用的HttpResponse現在公開HeadersWritten財產(見the msdn docs):

if (HttpContext.Current.Response.HeadersWritten) { ... } 
0

我用HttpContext.Current.Response.Headers。計數,發送Header的Total時增加;您可以根據需要應用If語句。