2010-06-29 86 views
16

Necesito leer una ubicación en mi enrutador, pero obtengo la siguiente excepción: ServerProtocolViolation "El servidor cometió una infracción de protocolo. Section = ResponseHeader Detail = CR debe ir seguido por LF"C#: Manejo WebClient "violación de protocolo"

Esto ocurre cuando uso la función .DownloadString (url). ¿Hay alguna manera de hacer que WebClient ignore la violación del protocolo? Las búsquedas en Google me dicen que debo establecer la opción useUnsafeHeaderParsing en alguna parte. ¿Puedo hacerlo a través del programa? ¿Cuál es el truco si lo uso?

edición: Asociación de código -

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

Es posible que desee pegar el código en su pregunta. –

Respuesta

21

Parece que la manera más fácil está incluyendo un archivo .config con su aplicación que contiene lo siguiente:

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

Sin embargo también es posible hacerlo dentro del código, pero parece un poco desordenado:

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

También tenga en cuenta que la definición de MSDN de que la propiedad es

establecer esta propiedad ignora errores de validación que se producen durante análisis HTTP.

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

así que yo diría que es bastante seguro de usar, aunque sí menciona a sólo lo uso para la compatibilidad hacia atrás.

+0

Siento que puedes hacer esto de otra manera. Mi instinto dice que el administrador del punto de servicio o subglass HttpWebRequest –

+6

Gracias, funciona a pesar de que es complicado como dijiste. Esto debería haber sido tan simple como establecer una propiedad en la clase WebClient. La decisión de Microsoft de (casi) el cumplimiento del código rígido con RFC es muy cuestionable, debería haber quedado abierta a la programmar. Esto casi parece una corta visión: pensar que el programador siempre tiene acceso para corregir las infracciones del protocolo del lado del servidor. – KalEl

0

tuve este problema en mi propio servidor web, en la cabecera he cambiado

HTTP/1.x 200 OK 

a

HTTP/1.0 200 OK 

ahora funciona cuando se utiliza un navegador (o chorome ...) o en el cliente Web (C#)

Cuestiones relacionadas