服务器违反了协议。部分=响应头详细信息=CR必须跟随LF,在WinForms中?

48

我正在尝试使用WebClient / HttpWebRequest从服务器下载一些数据。 我使用以下代码来执行此操作:

WebClient client = new WebClient();
client.Credentials = new NetworkCredential("admin", "password");
Stream datastream = client.OpenRead("http://routerlogin.com/cgi-bin/CF_logs.html");
StreamReader reader = new StreamReader(datastream);

服务器在我的路由器配置中,我的页面可以通过浏览器正常访问,但是使用我的代码下载时会抛出一个WebException,并显示以下信息:

服务器有协议违规行为。部分=ResponseHeader详细信息=CR必须跟随LF,在WinForms中?

我找到了一种解决方案,如果使用ASP.net,则可以将以下内容添加到web.config文件中:

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

然而,我正在制作一个 WinForms 应用程序,所以这对我来说行不通。有什么替代方案可以解决这个问题吗?


1
这应该适用于各种类型的应用程序,而不仅仅是asp.net。 - shriek
我应该把它添加到哪里?没有web或app.config文件。 - msbg
2
我正在经历的奇怪事情是,我们网络中的一个PC出现了错误,但其他使用同一应用程序的PC却正常工作。当我添加上述条目后,该PC也开始正常工作。问题是为什么这个问题只出现在单个PC上(该PC进行了新安装)。 - Kamran Shahid
只是想分享我的经验,和Kamran Shahid的经历一样,其他所有电脑都可以工作,但我的不能。我唯一的猜测是在Fiddler中检查响应头时看到的奇怪字符,在传递的set-cookie中间。Notepad++将此特殊字符呈现为SOH,我在Google上搜索了一下,发现它是标题开始的意思。[链接]http://eureka.greenhead.com/server-committed-a-protocol-violation-cr-must-be-followed-by-lf/ 阅读完这篇文章后,我不确定是否还有其他解决方法,除了更换服务器。以上的配置更改并没有解决问题。 - spacebread
3个回答

29

首先,添加一个app.config 文件就像添加其他任何文件一样简单,如何在C#项目中添加应用程序配置文件

然后,您只需将上面的代码片段添加到新的 app.config 中即可。

还有一种通过代码设置该属性的方法,避免了需要 app.config 的需要,在此处此处 显示。


2
您的问题可能不需要进行任何app.config更改(在我的情况下,此配置更改没有任何影响)。建议尝试修改Accept:header,可以参考这个链接中的建议。
在我的情况下,我直接创建了一个HttpWebRequest,所以我的解决方案是添加以下内容:
request.Accept = "text/html, application/xhtml+xml, */*"

0

我遇到了同样的问题。我是这样解决的。 将header的\r\n\r\n与数据分开


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接