问题
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:
Add to Web.config.
<system.net> <settings> <httpWebRequest useUnsafeHeaderParsing="true"/> </settings> </system.net>`
Add the line:
webRequest.ProtocolVersion = HttpVersion.Version10;
to the code.- 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