2012-07-26 4 views
8

sto cercando di inviare una HttpWebRequest utilizzando un proxy Tor con la mia applicazione asp.net e ricevo questo messaggio di errore quando si chiama il metodo webresponse.GetResponse():Il server ha commesso una violazione del protocollo. Sezione = ResponseStatusLine quando si utilizza un proxy Tor

The server committed a protocol violation. Section=ResponseStatusLine

ho provato a cercare una soluzione sul web e ho trovato 3 soluzioni principali per questo errore:

  1. Aggiungi al web.config.

    <system.net> 
        <settings> 
        <httpWebRequest useUnsafeHeaderParsing="true"/> 
        </settings> 
    </system.net>` 
    
  2. aggiungere la riga: webRequest.ProtocolVersion = HttpVersion.Version10; al codice.

  3. Aggiungere la riga request.ServicePoint.Expect100Continue = false; al codice.

Ciascuna delle soluzioni elencate non ha modificato nulla sul messaggio di errore.

Ecco il codice di richiesta:

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; 

Qualcuno può aiutarmi a trovare una soluzione per questo?

risposta

3

è possibile ottenere ulteriori informazioni su l'eccezione che si stanno ottenendo che è in realtà un WebException guardando la Response proprietà di eccezione e poi controllando le proprietà StatusDescription e StatusCode. Ciò ti aiuterà a ottenere maggiori dettagli sull'errore e, auspicabilmente, ti indirizzerà nella giusta direzione.

Qualcosa di simile a questo:

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

Inoltre, dare un'occhiata a WebException.Status esempio su MSDN per ottenere maggiori dettagli

+3

Ho provato ad aggiungere queste righe ma lo stato non è un errore di protocollo ma ServerProtocolViolation. –

+3

In effetti, la risposta è nullo per la mia eccezione :( –

+0

Lo stesso problema qui. La risposta è nullo. – tnktnk

0

Ho avuto lo stesso problema. il metodo httpwebrequest getresponse restituisce sempre il vialotion del protocollo di errore e ho risolto il problema in questo modo;

prima di tutto utilizzo l'oggetto com xml invece di xdocument o xmldocument.

questo oggetto com ha alcune versioni di Microsft XML, v3.0-v5.0-v6.0. ho usato 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 
}