C#: 处理WebClient的“协议违规”问题

17

我需要在我的路由器中读取一个位置,但是我遇到了以下异常 -

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

当我使用.DownloadString(url)函数时,出现了这种情况。有没有办法让WebClient忽略协议违规?在Google中搜索告诉我应该在某个地方设置useUnsafeHeaderParsing选项。我能通过程序来做吗?如果我使用它会有什么风险?

编辑:附上代码 -

    public Readlog() {
        WebClient wc = new WebClient();

        string url = @"http://192.168.0.1/setup.cgi?next_file=log.htm&todo=cfg_init";
        Console.WriteLine(url);
        try {
            //wc.Headers.Add("User-Agent", "Mozilla/5.0(Windows; U; Windows NT 5.2; rv:1.9.2) Gecko/20100101 Firefox/3.6");
            wc.Credentials = new NetworkCredential("admin", "admin");
            //Next line causes exception System.Net.WebException
            //Message - "The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF"
            //May be I need to use useUnsafeHeaderParsing somehow to avoid that
            string result = wc.DownloadString(url);
            Console.WriteLine(result);
        } catch (WebException we) {
            System.Diagnostics.Trace.WriteLine(we.ToString());
        }
    }

你可能想把你的代码粘贴到你的问题中。 - Jim Lamb
2个回答

26

看起来最简单的方法是在你的应用程序中包含一个名为 .config 的文件,并包含以下内容:

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

但是,也有可能在代码中完成,但这似乎有点凌乱:

http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/ff098248-551c-4da9-8ba5-358a9f8ccc57

还要注意该属性的MSDN定义:

设置此属性会忽略 在HTTP解析期间发生的验证错误。

http://msdn.microsoft.com/en-us/library/system.net.configuration.httpwebrequestelement.useunsafeheaderparsing.aspx

因此,我认为使用它是相当安全的,尽管它提到仅用于向后兼容。


我觉得你可以用另一种方式来实现。我的直觉告诉我可以使用服务点管理器或子类化HttpWebRequest。 - Christopher Tarquini
7
谢谢,它有效,虽然如你所说有些混乱。这本应该很简单,只需要在WebClient类中设置一个属性即可。Microsoft决定(几乎)硬编码符合RFC的决定非常值得质疑 - 应该让程序员自行决定。这似乎有点短视 - 认为程序员总是可以修复服务器端协议违规问题。 - KalEl

-1

我在自己的Web服务器上遇到了这个问题,在头部进行了更改

HTTP/1.x 200 OK

HTTP/1.0 200 OK

现在我使用浏览器(如Chrome等)或WebClient(C#)时,它可以正常工作。


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