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

96

Я только что получил это исключение (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);
Брайан Суини
источник

Ответы:

152

Просто не получить поток запросов. Запросы 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);
        ...
    }
}
Джон Скит
источник
15
Технически запросы GET могут иметь тела, но .NET не поддерживает создание запросов GET с телами. stackoverflow.com/questions/2064281/…
mhud
1
@JonSkeet Ты, должно быть, гений или что-то в этом роде. Именно это и решило мою проблему. +1.
Eternal Learner
3
@EternalLearner У вас есть это наоборот. Правильное выражение: «Гений, ты, должно быть, Скит или что-то в этом роде». :) Это тоже меня разобрало, и я поставил респонденту +1, прежде чем понял, что помогаю мистеру Скиту на 1M.
Дэн Соловей
@JonSkeet, есть ли способ отправить запрос GET с телом содержимого, используя HttpClientи HttpRequestMessage?
Шимми Вайцхандлер
@JonSkeet NM Я получил здесь свой ответ .
Шимми Вайцхандлер
5

У меня была аналогичная проблема с использованием 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.

flam3
источник
2

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

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

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

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

И метод Header:

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;
}
Equiman
источник
-7

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

 request.ContentType = "text/xml";
Навин Кумар
источник