2010-06-29 14 views
16

Je dois lire un emplacement dans mon routeur, mais j'ai l'exception suivante - ServerProtocolViolation "Le serveur a commis une violation de protocole Section = ResponseHeader Detail = CR doit être suivi par LF"C#: Gestion de "violation de protocole" WebClient

Cela se produit lorsque j'utilise la fonction .DownloadString (url). Est-il possible de faire en sorte que WebClient ignore la violation du protocole? Les recherches dans Google me disent que je devrais mettre l'option useUnsafeHeaderParsing quelque part. Puis-je le faire à travers le programme? Quel est le piège si je l'utilise?

Edit: Code Fixation -

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

Vous pouvez coller votre code dans votre question. –

Répondre

21

On dirait que la façon la plus simple est d'inclure un fichier .config avec votre application contenant les éléments suivants:

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

Cependant, il est aussi possible de le faire dans le code, mais il semble un peu désordonné:

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

Notez également que la définition MSDN de cette propriété est

définition de cette propriété ne tient pas compte erreurs de validation qui se produisent lors de analyse HTTP.

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

Je dirais qu'il est assez sûr à utiliser, bien qu'il ne mentionne à utiliser uniquement pour la compatibilité ascendante.

+0

Je me sens comme vous pouvez le faire d'une autre manière. Mon instinct dit gestionnaire de point de service ou subglassing HttpWebRequest –

+6

Merci, cela fonctionne bien que ce soit désordonné comme vous l'avez dit. Cela aurait dû être aussi simple que de définir une propriété dans la classe WebClient. La décision de Microsoft de respecter (presque) rigoureusement le code RFC est très discutable - il aurait dû rester ouvert au programme. Cela ressemble presque à un shortsight - en pensant que le programmeur a toujours accès à réparer les violations de protocole côté serveur. – KalEl

0

J'ai eu ce problème dans mon propre serveur web, en-tête, j'ai changé

HTTP/1.x 200 OK 

à

HTTP/1.0 200 OK 

maintenant il fonctionne quand j'utilise un navigateur (ou chorome ...) ou WebClient (C#)

Questions connexes