9

我正在尝试通过我的 asp.net 应用程序使用 Tor 代理发送 httpwebrequest,并且在调用 webresponse.GetResponse() 方法时收到此错误消息:

服务器违反了协议。Section=ResponseStatusLine

我尝试在网上搜索解决方案,发现此错误的 3 个主要解决方案:

  1. 添加到 Web.config。

    <system.net>
      <settings>
        <httpWebRequest useUnsafeHeaderParsing="true"/>
      </settings>
    </system.net>`
    
  2. 将行:添加webRequest.ProtocolVersion = HttpVersion.Version10;到代码中。

  3. 将该行添加request.ServicePoint.Expect100Continue = false;到代码中。

列出的每个解决方案都没有改变错误消息的任何内容。

这是请求代码:

WebRequest.DefaultWebProxy = new WebRequest("127.0.0.1:9051");
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);

webRequest.CookieContainer = new CookieContainer();
webRequest.ProtocolVersion = HttpVersion.Version10;
webRequest.KeepAlive = false;
webRequest.Method = "GET";
webRequest.ContentType = "application/x-www-form-urlencoded";
webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
webRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19";

HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
StreamReader streamReader = new StreamReader(webResponse.GetResponseStream());

string html = streamReader.ReadToEnd();
webResponse.Close();
return html;

谁能帮我找到解决方案?

4

2 回答 2

3

您可以通过查看异常的属性然后检查和属性来获取有关您所获得的异常的更多详细信息,该异常实际上是一个WebException。这将帮助您获得有关错误的更多详细信息,并希望为您指明正确的方向。ResponseStatusDescriptionStatusCode

像这样的东西:

    catch(WebException e) 
    {
        if(e.Status == WebExceptionStatus.ProtocolError)
        {
            Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
            Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
        }
    }

另外,请查看 MSDN 上的WebException.Status示例以获取更多详细信息

于 2012-07-26T17:58:22.217 回答
0

我有同样的问题。httpwebrequest getresponse 方法总是返回错误协议 vialotion,我以这种方式解决了问题;

首先,我使用 xml com 对象而不是 xdocument 或 xmldocument。

这个 com 对象有几个版本的 Microsft XML,v3.0-v5.0-v6.0。我用的是 v6.0。

MSXML2.DOMDocument60Class doc = new MSXML2.DOMDocument60Class();
doc.setProperty("ServerHTTPRequest",true);
doc.setProperty("ProhibitDTD", false); 
doc.async = false;
doc.load(extURL);  

if (doc.parseError.errorCode != 0)
{
 // error  
}
else
{
 // do stuff
}
于 2015-03-20T09:26:11.603 回答