Không thể gửi nội dung-nội dung với loại động từ này


95

Tôi vừa có ngoại lệ này (ProtocolViolationException) trong ứng dụng .NET 2.0 của mình (chạy trên trình giả lập tiêu chuẩn windows mobile 6). Điều khiến 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 ở dưới đây (rất đơn giản). Có điều gì khác tôi cần làm để thuyết phục .NET rằng đây chỉ là một http GET không?

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);

Câu trả lời:


152

Không nhận được luồng yêu cầu, khá đơn giản. Yêu cầu GET thường không có phần thân (mặc dù nó không bị HTTP cấm về mặt kỹ thuật ) và WebRequestkhông hỗ trợ nó - nhưng đó là những gì gọi GetRequestStreamlà để cung cấp dữ liệu phần thân cho yêu cầu.

Cho rằng bạn đang cố gắng đọc từ luồng, tôi có vẻ như bạn thực sự muốn nhận phản hồi và đọc luồng phản hồi từ đó:

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);
        ...
    }
}

14
Về mặt kỹ thuật, yêu cầu GET có thể có phần thân, nhưng .NET không hỗ trợ tạo yêu cầu GET với phần thân. stackoverflow.com/questions/2064281/…
mhud

1
@JonSkeet Bạn phải là một thiên tài hay gì đó. Đó chính xác là những gì đã giải quyết vấn đề của tôi. +1.
Eternal Learner,

3
@EternalLearner Bạn có điều đó ngược lại. Cách diễn đạt thích hợp là, "Thiên tài, bạn phải là một Skeet hay gì đó." :) Điều này cũng giúp tôi giải quyết vấn đề và tôi đã cho người trả lời +1 trước khi nhận ra mình đang giúp ông Skeet đạt 1 triệu.
Dan Solovay

@JonSkeet, có cách nào để gửi yêu cầu GET với nội dung bằng cách sử dụng HttpClientHttpRequestMessagekhông?
Shimmy Weitzhandler 23/02/18

@JonSkeet NM Tôi đã có câu trả lời ở đây .
Shimmy Weitzhandler

5

Tôi đã gặp sự cố tương tự khi sử dụng Flurl.

Flurl.Http.FlurlHttpException: Call failed. Cannot send a content-body with this verb-type. GET http://******:8301/api/v1/agents/**** ---> System.Net.ProtocolViolationException: Cannot send a content-body with this verb-type.

Vấn đề là tôi đã sử dụng .WithHeader("Content-Type", "application/json")khi tạo IFlurlRequest.


2

Vì bạn không chỉ định Header.

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

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

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

Và Header của phương thức:

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;
}

-7

Vui lòng đặt Loại nội dung yêu cầu trước khi bạn đọc luồng phản hồi;

 request.ContentType = "text/xml";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.