2007年8月21日 星期二

HttpWebRequest 錯誤訊息 "The server committed a protocol violation..." 的解法
MSN SpaceGoogle DocGoogle Blog
Chui-Wen Chiu
2007.08.22

今天收到一個錯誤訊息"The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF", Google 一下有相當多這方面的資料。我就不一一細列,這個錯誤主要是因為 Web Server 回傳的 HTTP 訊息結尾只有 n,而 .NET 實作的 WebRequest 預設情況下,必須符合 RFC 855 實作,也就是結尾必須包含 rn。所以,當 .NET 的 WebRequest 收到這個 HTTP 訊息時,就會出現錯誤。

解法兩個,一個就是讓 Web Server 丟出的 HTTP 訊息符合 RFC 855,另一個就是是讓 WebRequest 睜一隻眼閉一隻眼,亦即將 WebRequest 的 UseUnsafeHeaderParsing 屬性設為 true,這個屬性在 MSDN 文件上得描述如下:

當這個屬性設定為 false 時,會在 HTTP 剖析期間執行下列驗證:

  • 在行結尾程式碼中使用 CRLF;不允許單獨使用 CR 或 LF。

  • 標頭名稱中不應該有空格。

  • 如果有多個狀態列,會將所有額外狀態列視為不正確的標頭名稱/值組。

  • 除了狀態碼外,狀態列還必須有狀態描述。

  • 標頭名稱中不能有非 ASCII 字元。無論這個屬性設定為 truefalse,都會執行這個驗證。

當發生通訊協定違規時,會擲回 WebException 例外狀況,並將狀態設定為 ServerProtocolViolation。如果 UseUnsafeHeaderParsing 屬性設定為 true,則會忽略驗證錯誤。

將這個屬性設定為 true 具有安全性含義,因此只有在需要與伺服器的回溯相容性 (Backward Compatibility) 時,才應該執行此動作。


需要注意的是這個屬性到 .NET 2.0 才新增的,且文件中也提到除非為了 Web Server 回溯相容,否則還是設定為 false。另外,如果要全面套用到每一個使用到 WebRequest 的地方,在 app.config 加上下面的設定:

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


沒有留言:

搜尋此網誌