Неможливо надіслати тіло вмісту з цим типом дієслова


95

Щойно я отримав цей виняток (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);
        ...
    }
}

14
Технічно GET-запити можуть мати тіла, але .NET не підтримує генерування запитів GET з тілами. stackoverflow.com/questions/2064281 / ...
mhud

1
@JonSkeet Ви, мабуть, геній чи щось інше. Саме це і вирішило мою проблему. +1.
Eternal Learner

3
@EternalLearner У вас це є назад. Правильний вираз: "Геній, ти мусиш бути Скітом чи що-небудь". :) Це теж розібрало мене, і я дав відповіді +1, перш ніж зрозумів, що допомагаю містеру Скіту до 1М.
Ден Соловай,

@JonSkeet, чи є спосіб надіслати GET-запит із тілом вмісту за допомогою HttpClientта HttpRequestMessage?
Shimmy Weitzhandler

@JonSkeet NM Я отримав тут свою відповідь .
Shimmy Weitzhandler

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.


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

-7

Будь ласка, встановіть тип вмісту запиту перед тим, як прочитати потік відповідей;

 request.ContentType = "text/xml";
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.