2010-06-29 3 views
16

Мне нужно прочитать местоположение в моем маршрутизаторе, но я получаю следующее исключение: ServerProtocolViolation «Сервер совершил нарушение протокола. Раздел = ResponseHeader Detail = CR должен сопровождаться LF"C#: обращение с нарушением протокола WebClient

Это происходит, когда я использую функцию .DownloadString (url). Есть ли способ заставить WebClient игнорировать нарушение протокола? Поиски в Google говорят мне, что я должен установить параметр useUnsafeHeaderParsing где-нибудь. Могу ли я сделать это через программу? Какой улов, если я его использую?

Edit: Прикрепление кода -

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

Возможно, вы захотите вставить свой код в свой вопрос. –

ответ

21

Похоже, самый простой путь включая .config файл с приложением, содержащим следующее:

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

Однако это также возможно сделать это в рамках код, но это, кажется, немного грязный:

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

Также отметим, что определение MSDN этого свойства является

Установка этого свойства игнорирует проверки ошибок, которые возникают во время HTTP разборе.

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

Так что я бы сказал, что это довольно безопасно использовать, хотя он упоминает только использовать его для обратной совместимости.

+0

Я чувствую, что вы можете сделать это по-другому. Мой кишок говорит, что диспетчер точек обслуживания или подклассы HttpWebRequest –

+6

Спасибо, он работает, хотя он грязный, как вы сказали. Это должно быть так же просто, как установить свойство в классе WebClient. Решение Microsoft (почти) соблюдать жесткое соответствие RFC очень сомнительно - оно должно быть оставлено открытым для programmar. Это почти похоже на близорукость - думая, что у программиста всегда есть доступ к исправлению ошибок на стороне сервера. – KalEl

0

Я имел эту проблему в своем собственном веб-сервере, в заголовке я изменил

HTTP/1.x 200 OK 

в

HTTP/1.0 200 OK 

теперь он работает, когда я использую браузер (chorome или ...) или в WebClient (C#)

Смежные вопросы