2013-09-30 37 views
1

正如標題所述。強制讀取HttpWebResponse.GetResponseStream()當內容長度爲零時

有時來自遠程服務器的HTTP響應包含零值Content-Length頭,但是它仍然返回HTTP主體。 body仍然可以通過jQuery在瀏覽器中獲得,但是使用HttpWebResponse.GetResponseStream()不能讀取任何內容。我如何強制讀取它?感謝大家。

下面是我遇到的HTTP響應示例。


HTTP/1.1 200 OK

連接:保持活躍

緩存控制:無緩存,無店鋪

的Content-Type:text/plain的

Content-Length:0

Date:Mon,30 Sep 2013 09:34:21 GMT

(HTTP Body)

+1

_ 「我怎麼逼讀它?」 _ - 誠實:通過固定的服務器。 – CodeCaster

回答

0

翻看源代碼我找不到強制執行此操作的方法。可能沒有什麼可以做的。

嘗試禁用HTTP流水線。也許HttpWebRequest在這種情況下不依賴於內容長度。它不太可能會有所幫助。

要麼使用不同的HTTP庫,要麼使用TcpClient發送請求。您可以使用Fiddler複製模板HTTP請求並將其用作您的基礎。不應該是很多工作。

您也可以創建一個刪除標題的重寫代理。這可能是一個高效的解決方案。

0

第一個問題 - 你從哪裏獲得HTTP響應?您是使用Fiddler捕獲它還是通過在調試器中檢查HttpWebResponse來輸入您認爲您所看到的內容?我會建議用Fiddler運行這個,並檢查完整的響應標題,如果你還沒有。

如果Content-Length返回的值爲零或者項目中的某些其他代碼導致您將其解釋爲零或將您的內容長度副本設置爲零。

我想兩件事情發生在這裏:

  1. 的反應是不完全一樣的上方,與提琴手檢查將建立快速指示。很可能我會懷疑Content-Length實際上是缺少的,並且Transfer-Encoding存在並設置爲分塊;在這種情況下,HttpWebResponse.ContentLength屬性將返回-1而不是0(零)。
  2. 響應與您指出的完全相同(特別是Content-Length存在且指定爲零),在這種情況下,您的Web服務器只是被中斷。我不應該返回Content-Length設置爲零的主體;如果它是HTTP 1.0,它可以不返回Content-Length,但它清楚地說明了上面的HTTP 1.1,因此它應該返回Transfer-Encoding:分塊,並且不包含Content-Length或非零內容長度(如果不是分塊並返回身體。

哈羅德