2012-01-09 66 views
3

我正在通過HttpWebRequest/HttpWebResponse對象向網站發出請求。HttpWebResponse.GetResponse()fiddler說:「響應頭解析失敗。」

我正在對該網站進行幾次成功的調用,並且對同一動態頁面的每個其他調用都失敗。

在調試器中,我得到一個「內部服務器錯誤500」小提琴手也顯示出500的響應,包含:

[Fiddler] Response Header parsing failed. 
This can be caused by an illegal HTTP response earlier on this reused server socket--  for instance, a HTTP/304 response which illegally contains a body. 
Response Data: 
<plaintext> 
0D 0A 3C 21 44 4F 43 54 59 50 45 20 48 54 4D 4C 20 50 55 42 4C 49 43 20 ..<!DOCTYPE  HTML PUBLIC 
22 2D 2F 2F 57 33 43 2F 2F 44 54 44 20 48 54 4D 4C 20 34 2E 30 20 54 72 "-//W3C//DTD HTML 4.0 Tr 
61 6E 73 69 74 69 6F 6E 61 6C 2F 2F 45 4E 22 3E 0D 0A 3C 48 54 4D 4C 3E ansitional//EN">..<HTML> 
0D 0A 09 3C 48 45 41 44 3E 0D 0A 09 09 3C 74 69 74 6C 65 3E 56 69 65 77 ...<HEAD>....<title>View 

我已經刪除了所有的十六進制和瀏覽網頁併爲我所期望返回,但由於某種原因,服務器報告500,並且HttpWebRequest對象在此上引發異常。

我試過所有其他「修復」這個問題,沒有工作。它可能只是從服務器發送的格式錯誤的數據,但是有比使用HttpWebRequest更低級別的對象而不是皮塔可以使用?

編輯:我沒有在上面的例子中包含整個十六進制/整個html塊。
編輯:關閉提琴手我得到這個在調試器

編輯:所以,從我所看到的在HttpWebResponse對象採取相應的行動。該服務器只是片狀,有時用不同的http狀態碼返回相同的確切數據。爲了快速解決問題,我只是將每個調用包裝在try/catch中,並在catch塊中調用完全相同的調用。到目前爲止,它工作的很好,並且證明它是網站的錯誤,而不是HttpWebResponse對象。

The server committed a protocol violation. Section=ResponseStatusLine 
+1

你有比你想打的網站控制? – 2012-01-09 00:04:36

+0

@ M.Babcock我不知道。到目前爲止,它看起來像我可以從500響應剝離HTML並解析,但這會很臭! – user1231231412 2012-01-09 00:06:45

+0

@Amadan這是一個winforms應用程序。 – user1231231412 2012-01-09 00:20:12

回答

0

喜喬恩,

的是沒有Fiddler的結果相同? (只是在屏幕上打印例外)。我有時會遇到調試器不當行爲的麻煩。

如果服務器返回間歇性錯誤並且您無法控制它,恐怕您不能做太多。消息似乎很清楚,這是304的一個標準,即響應不應該有一個主體,但服務器可以做任何想要的事情,所以它幾乎是它的問題。

見W3C:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

如果客戶端已經執行了條件GET請求和訪問是 允許的,但文件沒有被修改,服務器應該與此狀態碼。 304響應不能包含消息體,因此總是由頭字段後的第一個空行終止。

關於HttpWebRequest,我從來沒有任何問題,從來沒有聽說過任何情況下它不能處理HTTP通信。但是如果你想要自己去處理數據包,谷歌如何用套接字建立你自己的HttpWebRequest。

這個項目可能是一個開始: http://www.codeproject.com/Articles/13486/A-Simple-Crawler-Using-C-Sockets

+0

感謝您的鏈接,這看起來像一個很好的項目。 – user1231231412 2012-01-26 18:08:11

1

HTTP 304響應表示自上次訪問頁面(它們很可能使用緩存)後頁面內容未發生變化。遇到這種情況時,不要頻繁地點擊頁面或緩存響應。

EDIT

服務器發送包含數據無效304響應。這違反了HTTP規範,並且HttpWebResponse/Fiddler正在有效地將其轉換爲500。

編輯

您可以使用HttpWebRequest/HttpWebResponse保持如果你使用你的app.config以下設置:

<configuration> 
    <system.net> 
     <settings> 
      <httpWebRequest useUnsafeHeaderParsing="true" /> 
     </settings> 
    </system.net> 
</configuration> 
+0

在第一頁點擊我收集了一些我正在下載的文件的鏈接,每個後續點擊到該網站是相同的「下載」網址,但具有不同的查詢字符串參數。我認爲這會阻止緩存,但這可能只適用於特定的配置。 – user1231231412 2012-01-09 00:18:49

+0

這將取決於他們的緩存系統有多複雜,顯然這不是非常生成畸形的HTTP響應。 – 2012-01-09 00:21:45

+0

這是一個.NET 1.1網站,並且有很大的格式錯誤的html,因此可能不會:) – user1231231412 2012-01-09 00:24:31