Nie można wysłać treści treści z tym typem czasownika

96

Właśnie dostałem ten wyjątek (ProtocolViolationException) w mojej aplikacji .NET 2.0 (działającej na standardowym emulatorze systemu Windows Mobile 6). Co mnie wprawia w zakłopotanie, to to, że o ile wiem, nie dodałem żadnej treści, chyba że w jakiś sposób nieumyślnie to zrobiłem. Mój kod jest poniżej (bardzo prosty). Czy jest jeszcze coś, co muszę zrobić, aby przekonać .NET, że to tylko http GET?

Dzięki, 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);
Brian Sweeney
źródło

Odpowiedzi:

152

Po prostu nie otrzymuj strumienia żądań. Żądania GET zwykle nie mają treści (mimo że nie jest to technicznie zabronione przez HTTP ) i WebRequestnie obsługują tego - ale właśnie to wywołujeGetRequestStream służy , dostarczanie danych treści dla żądania.

Biorąc pod uwagę, że próbujesz czytać ze strumienia, wydaje mi się, że faktycznie chcesz uzyskać odpowiedź i przeczytać strumień odpowiedzi z tego:

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);
        ...
    }
}
Jon Skeet
źródło
15
Z technicznego punktu widzenia żądania GET mogą mieć treści, ale .NET nie obsługuje generowania żądań GET z treściami. stackoverflow.com/questions/2064281/…
mhud
1
@JonSkeet Musisz być geniuszem czy coś. Właśnie to rozwiązało mój problem. +1.
Eternal Learner
3
@EternalLearner Masz to od tyłu. Właściwe wyrażenie brzmi: „Geniuszu, musisz być Skeetem czy coś w tym rodzaju”. :) To też mnie załatwiło i dałem odpowiadającemu +1, zanim zdałem sobie sprawę, że pomagam Panu Skeetowi osiągnąć 1M.
Dan Solovay
@JonSkeet, czy istnieje sposób wysyłania żądania GET z treścią przy użyciu HttpClienti HttpRequestMessage?
Shimmy Weitzhandler
@JonSkeet NM Mam tutaj swoją odpowiedź .
Shimmy Weitzhandler
5

Miałem podobny problem z 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.

Problem został użyty .WithHeader("Content-Type", "application/json")podczas tworzenia IFlurlRequest.

flam3
źródło
2

Ponieważ nie określiłeś nagłówka.

Dodałem rozszerzony przykład:

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

Nagłówek (żądanie ref, p_Method);

I metoda 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
źródło
-7

Przed odczytaniem strumienia odpowiedzi ustaw typ zawartości żądania;

 request.ContentType = "text/xml";
Naveen Kumar
źródło