Не удается отправить контент-тело с помощью этого глагольного типа

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

Ответ 1

Не получите поток запроса, просто. Запросы 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);
        ...
    }
}

Ответ 2

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

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

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

Заголовок (запрос ref, 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;
}

Ответ 3

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

Ответ 4

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

 request.ContentType = "text/xml";