The server committed a protocol violation. Section=ResponseStatusLine when using a tor proxy

大憨熊 提交于 2020-01-24 03:05:23

问题


I'm trying to send an httpwebrequest using a tor proxy with my asp.net application and I receive this error message when calling the webresponse.GetResponse() method:

The server committed a protocol violation. Section=ResponseStatusLine

I've tried searching for a solution on the web and I found 3 main solutions for this error:

  1. Add to Web.config.

    <system.net>
      <settings>
        <httpWebRequest useUnsafeHeaderParsing="true"/>
      </settings>
    </system.net>`
    
  2. Add the line: webRequest.ProtocolVersion = HttpVersion.Version10; to the code.

  3. Add the line request.ServicePoint.Expect100Continue = false; to the code.

Each one of the listed solutions didn't change a thing about the error message.

Here's the request code:

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;

Can anyone help me find a solution for this?


回答1:


You can get more details about the exception you are getting which is actually a WebException by looking at the Response property of the exception and then checking the StatusDescription and StatusCode properties. That will help you get more details about the error and hopefully point you in the right direction.

Something like this:

    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);
        }
    }

Also, take a look at WebException.Status example on MSDN to get more details




回答2:


I had the same problem. httpwebrequest getresponse method always return error protocol vialotion and i solved probled this way ;

first of all i use xml com object instead of xdocument or xmldocument.

this com object's have a few version Microsft XML , v3.0-v5.0-v6.0. i used 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
}


来源:https://stackoverflow.com/questions/11674938/the-server-committed-a-protocol-violation-section-responsestatusline-when-using

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!