2010-10-20 9 views
68

Tôi vừa nhận ngoại lệ này (ProtocolViolationException) trong ứng dụng .NET 2.0 của mình (chạy trên trình mô phỏng chuẩn của Windows Mobile 6). Điều làm tôi bối rối là theo như tôi biết, tôi đã không thêm bất kỳ nội dung nào, trừ khi tôi vô tình làm điều đó bằng cách nào đó. Mã của tôi là dưới đây (rất đơn giản). Có điều gì khác tôi cần phải làm để thuyết phục .NET rằng đây chỉ là một GET http?Không thể gửi nội dung có nội dung với loại động từ này

Cảm ơn, brian

//run get and grab response 
WebRequest request = WebRequest.Create(get.AbsoluteUri + args); 
request.Method = "GET"; 
Stream stream = request.GetRequestStream();   // <= explodes here 
XmlTextReader reader = new XmlTextReader(stream); 

Trả lời

111

Đừng dòng yêu cầu, khá đơn giản. Yêu cầu GET không thường là có các phần thân (mặc dù đó là not technically prohibited by HTTP) và WebRequest không hỗ trợ nó - nhưng đó là những gì gọi GetRequestStream là dành cho, cung cấp dữ liệu nội dung cho yêu cầu.

Cho rằng bạn đang cố gắng đọc từ con suối, có vẻ với tôi như bạn thực sự muốn có được phản ứng và đọc những dòng phản hồi từ rằng:

WebRequest request = WebRequest.Create(get.AbsoluteUri + args); 
request.Method = "GET"; 
using (WebResponse response = request.GetResponse()) 
{ 
    using (Stream stream = response.GetResponseStream()) 
    { 
     XmlTextReader reader = new XmlTextReader(stream); 
     ... 
    } 
} 
+0

thực sự đó chính xác là những gì tôi muốn làm. cảm ơn. –

+10

Về mặt kỹ thuật, các yêu cầu GET có thể có các cơ quan, nhưng .NET không hỗ trợ tạo ra GET reqeusts với các cơ quan. http://stackoverflow.com/questions/2064281/sending-post-data-with-get-request-valid – mhud

+1

@mhud: Cảm ơn, sẽ chỉnh sửa. –

2

Bởi vì bạn trai tôi không không chỉ định Tiêu đề.

Tôi đã thêm một ví dụ mở rộng:

var request = (HttpWebRequest)WebRequest.Create(strServer + strURL.Split('&')[1].ToString()); 

Header (ref yêu cầu, p_Method);

Và phương pháp Tiêu đề:

private void Header(ref HttpWebRequest p_request, string p_Method) 
{ 
    p_request.ContentType = "application/x-www-form-urlencoded"; 
    p_request.Method = p_Method; 
    p_request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE)"; 
    p_request.Host = strServer.Split('/')[2].ToString(); 
    p_request.Accept = "*/*"; 
    if (String.IsNullOrEmpty(strURLReferer)) 
    { 
     p_request.Referer = strServer; 
    } 
    else 
    { 
     p_request.Referer = strURLReferer; 
    } 
    p_request.Headers.Add("Accept-Language", "en-us\r\n"); 
    p_request.Headers.Add("UA-CPU", "x86 \r\n"); 
    p_request.Headers.Add("Cache-Control", "no-cache\r\n"); 
    p_request.KeepAlive = true; 
} 
-3

Hãy đặt Loại yêu cầu nội dung trước khi bạn đọc những dòng phản ứng;

request.ContentType = "text/xml";