2010-06-29 30 views
16

Tôi cần đọc vị trí trong Bộ định tuyến của mình, nhưng tôi nhận được ngoại lệ sau - ServerProtocolViolation "Máy chủ đã vi phạm giao thức. Phần = ResponseHeader Chi tiết = CR phải được theo sau bởi LF"C#: Xử lý WebClient "vi phạm giao thức"

Điều này xảy ra khi tôi sử dụng hàm .DownloadString (url). Có cách nào để làm cho WebClient bỏ qua vi phạm giao thức? Các tìm kiếm trong Google cho tôi biết tôi nên đặt tùy chọn useUnsafeHeaderParsing ở đâu đó. Tôi có thể làm điều đó thông qua chương trình? Bắt nếu tôi sử dụng nó là gì?

Edit: Gắn mã -

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

Bạn có thể dán mã của mình vào câu hỏi. –

Trả lời

21

Hình như là cách dễ nhất là bao gồm một tập tin .config với ứng dụng của bạn có chứa những điều sau đây:

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

Tuy nhiên nó cũng có thể làm điều đó trong mã nhưng có vẻ hơi lộn xộn:

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

Cũng lưu ý rằng định nghĩa MSDN của tài sản đó là

Thiết tài sản này bỏ qua lỗi xác nhận xảy ra trong HTTP phân tích cú pháp.

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

Vì vậy, tôi muốn nói rằng nó khá an toàn để sử dụng, mặc dù nó không đề cập đến chỉ sử dụng nó để tương thích ngược.

+0

Tôi cảm thấy bạn có thể làm điều này theo cách khác. Ruột của tôi nói quản lý điểm dịch vụ hoặc subglassing HttpWebRequest –

+6

Cảm ơn, nó hoạt động mặc dù nó là lộn xộn như bạn nói. Điều này cần phải đơn giản như thiết lập một thuộc tính trong lớp WebClient. Quyết định của Microsoft để (gần như) tuân thủ mã cứng với RFC là rất đáng nghi ngờ - nó cần phải được để mở cho chương trình. Điều này gần như trông giống như một quần short - trong suy nghĩ rằng các lập trình viên luôn có quyền truy cập để sửa chữa các vi phạm giao thức phía máy chủ. – KalEl

0

Tôi có vấn đề này trong máy chủ web của riêng tôi, trong phần đầu tôi đã thay đổi

HTTP/1.x 200 OK 

để

HTTP/1.0 200 OK 

bây giờ nó hoạt động khi tôi sử dụng một trình duyệt (chorome hoặc ...) hoặc trong WebClient (C#)

Các vấn đề liên quan