2010-06-29 17 views
16

Ho bisogno di leggere una posizione nel mio router, ma ottengo la seguente eccezione - ServerProtocolViolation "Il server ha commesso una violazione del protocollo Sezione = Dettaglio ResponseHeader = CR deve essere seguito da LF"C#: Gestione violazione del protocollo WebClient

Ciò si verifica quando utilizzo la funzione .DownloadString (url). C'è un modo per far sì che WebClient ignori la violazione del protocollo? Ricerche in Google mi dicono che dovrei impostare l'opzione useUnsafeHeaderParsing da qualche parte. Posso farlo attraverso il programma? Qual è il trucco se lo uso?

Edit: Codice Fissaggio -

public Readlog() { 
     WebClient wc = new WebClient(); 

     string url = @"http://192.168.0.1/setup.cgi?next_file=log.htm&todo=cfg_init"; 
     Console.WriteLine(url); 
     try { 
      //wc.Headers.Add("User-Agent", "Mozilla/5.0(Windows; U; Windows NT 5.2; rv:1.9.2) Gecko/20100101 Firefox/3.6"); 
      wc.Credentials = new NetworkCredential("admin", "admin"); 
      //Next line causes exception System.Net.WebException 
      //Message - "The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF" 
      //May be I need to use useUnsafeHeaderParsing somehow to avoid that 
      string result = wc.DownloadString(url); 
      Console.WriteLine(result); 
     } catch (WebException we) { 
      System.Diagnostics.Trace.WriteLine(we.ToString()); 
     } 
    } 
+0

È possibile incollare il codice nella domanda. –

risposta

21

Sembra che il modo più semplice è compreso un file .config con la tua applicazione contenente le seguenti:

<system.net> 
<settings> 
<httpWebRequest useUnsafeHeaderParsing = "true"/> 
</settings> 
</system.net> 

Tuttavia è anche possibile farlo all'interno del codice, ma mi sembra un po 'disordinato:

http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/ff098248-551c-4da9-8ba5-358a9f8ccc57

Si noti inoltre che la definizione di MSDN che la proprietà è

impostazione di questa proprietà ignora errori di convalida che si verificano durante l'analisi HTTP.

http://msdn.microsoft.com/en-us/library/system.net.configuration.httpwebrequestelement.useunsafeheaderparsing.aspx

Quindi direi che è abbastanza sicuro da usare, anche se non menziona da utilizzare solo per la compatibilità all'indietro.

+0

Mi sembra di poterlo fare in un altro modo. Il mio istinto dice service point manager o subglassing HttpWebRequest –

+6

Grazie, funziona anche se è disordinato come hai detto tu. Questo dovrebbe essere semplice come impostare una proprietà nella classe WebClient. La decisione di Microsoft di (quasi) una rigida conformità del codice con RFC è altamente discutibile - avrebbe dovuto essere lasciata aperta al programmar. Questo sembra quasi una visione breve - nel pensare che il programmatore abbia sempre accesso per correggere le violazioni del protocollo sul lato server. – KalEl

0

Ho avuto questo problema nel mio webserver, nell'intestazione ho cambiato

HTTP/1.x 200 OK 

a

HTTP/1.0 200 OK 

ora funziona quando uso di un browser (chorome o ...) o in WebClient (C#)

Problemi correlati