Невозможно отправить тело содержимого с этим типом глагола

Я только что получил это исключение (ProtocolViolationException) в своем приложении .NET 2.0 (работающем на стандартном эмуляторе Windows Mobile 6). Что меня смущает, так это то, что, насколько мне известно, я не добавлял никакого тела контента, если только я не сделал это как-то непреднамеренно. Мой код ниже (очень простой). Есть ли что-нибудь еще, что мне нужно сделать, чтобы убедить .NET, что это просто http GET?

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

person Brian Sweeney    schedule 20.10.2010    source источник


Ответы (4)


Просто не получайте поток запросов. Запросы GET обычно не имеют тела (хотя это технически не запрещено HTTP), а WebRequest не поддерживает его, но для этого и нужен вызов GetRequestStream, предоставляющий данные тела для запроса.

Учитывая, что вы пытаетесь читать из потока, мне кажется, что вы действительно хотите получить ответ и прочитать поток ответов из него:

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);
        ...
    }
}
person Jon Skeet    schedule 20.10.2010
comment
Технически запросы GET могут иметь тела, но .NET не поддерживает создание запросов GET с телами. stackoverflow.com/questions/2064281 / - person mhud; 11.07.2012
comment
@JonSkeet Ты, должно быть, гений или что-то в этом роде. Это именно то, что решило мою проблему. +1. - person Eternal Learner; 25.10.2012
comment
@EternalLearner У тебя это наоборот. Правильнее будет сказать, Гений, ты, должно быть, скит или что-то в этом роде. :) Меня это тоже устроило, и я поставил ответчику +1, прежде чем понял, что помогаю мистеру Скит в 1M. - person Dan Solovay; 02.05.2014
comment
@JonSkeet, есть ли способ отправить запрос GET с телом контента, используя HttpClient и HttpRequestMessage? - person Shimmy Weitzhandler; 23.02.2018
comment
@JonSkeet NM Я получил свой ответ здесь. - person Shimmy Weitzhandler; 23.02.2018

У меня была аналогичная проблема с использованием Flurl.Http:

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.

Проблема заключалась в том, что я использовал .WithHeader("Content-Type", "application/json") при создании IFlurlRequest.

person flam3    schedule 04.12.2018

Потому что вы не указали заголовок.

Я добавил расширенный пример:

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

Заголовок (запрос ссылки, p_Method);

И заголовок метода:

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;
}
person equiman    schedule 18.08.2011

Пожалуйста, установите тип содержимого запроса, прежде чем читать поток ответов;

 request.ContentType = "text/xml";
person Naveen Kumar    schedule 23.04.2013