2012-07-26 18 views
8

estoy tratando de enviar un HttpWebRequest usando un proxy Tor con mi aplicación asp.net y yo recibir este mensaje de error al llamar al método webresponse.GetResponse():El servidor cometió una violación de protocolo. Sección = ResponseStatusLine cuando se utiliza un proxy Tor

The server committed a protocol violation. Section=ResponseStatusLine

he intentado buscar una solución en la web y me encontré con 3 soluciones principales para este error:

  1. Añadir a Web.config.

    <system.net> 
        <settings> 
        <httpWebRequest useUnsafeHeaderParsing="true"/> 
        </settings> 
    </system.net>` 
    
  2. Añadir la línea: webRequest.ProtocolVersion = HttpVersion.Version10; al código.

  3. Agregue la línea request.ServicePoint.Expect100Continue = false; al código.

Cada una de las soluciones enumeradas no cambió nada el mensaje de error.

Aquí está el código de solicitud:

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; 

¿Puede alguien ayudarme a encontrar una solución para esto?

Respuesta

3

usted puede obtener más detalles acerca de la excepción de que está recibiendo lo que es en realidad un WebException examinado la propiedad Response de la excepción y luego verificando las StatusDescription y StatusCode propiedades. Eso lo ayudará a obtener más detalles sobre el error y, con un poco de suerte, le orientará en la dirección correcta.

Algo como esto:

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

También, echar un vistazo a WebException.Status ejemplo en MSDN para obtener más detalles

+3

Intenté agregar estas líneas, pero el estado no es un error de protocolo sino ServerProtocolViolation. –

+3

De hecho, la respuesta es nula para mi excepción :( –

+0

Mismo problema aquí. La respuesta es nula. – tnktnk

0

que tenía el mismo problema. El método httpwebrequest getresponse siempre devuelve el protocolo de error vialotion y resuelvo el problema de esta manera;

En primer lugar, utilizo el objeto xml com en lugar de xdocument o xmldocument.

este objeto tiene una versión Microsft XML, v3.0-v5.0-v6.0. utilicé 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 
} 
Cuestiones relacionadas