The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF 错误

今天公司的项目,发现一个非常诡异的现象,原来运行的好好的程序,现在点击没反应。后发现错误日志为:The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF 在网络上找了下答案。下面是网络摘抄过来的解决方法。自己汇总下。 这句错误的翻译:服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF 主体意思是微软没有容忍不符合RFC 822中的httpHeader必须以CRLF结束的规定的服务器响应。 下面是一位高人的解说,给大家分享下。 這個錯誤主要是因為 Web Server 回傳的 HTTP 訊息結尾只有 \n,而 .NET 實作的 WebRequest 預設情況下,必須符合 RFC 855 實作,也就是結尾必須包含 \r\n。所以,當 .NET 的 WebRequest 收到這個 HTTP 訊息時,就會出現錯誤。 解法兩個,一個就是讓 Web Server 丟出的 HTTP 訊息符合 RFC 855,另一個就是是讓 WebRequest 睜一隻眼閉一隻眼,亦即將 WebRequest 的 UseUnsafeHeaderParsing 屬性設為 true,這個屬性在 MSDN 文件上得描述如下: 當這個屬性設定為 false 時,會在 HTTP 剖析期間執行下列驗證: 在行結尾程式碼中使用 CRLF;不允許單獨使用 CR 或 LF。 標頭名稱中不應該有空格。 如果有多個狀態列,會將所有額外狀態列視為不正確的標頭名稱/值組。 除了狀態碼外,狀態列還必須有狀態描述。 標頭名稱中不能有非 ASCII 字元。無論這個屬性設定為 true 或 false,都會執行這個驗證。 當發生通訊協定違規時,會擲回 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>  
posted @ 2012-11-27 16:32  keepnode  阅读(773)  评论(0编辑  收藏  举报