Mit diesem Verbtyp kann kein Inhaltskörper gesendet werden

95

Ich habe gerade diese Ausnahme (ProtocolViolationException) in meiner .NET 2.0-App (ausgeführt unter Windows Mobile 6 Standard Emulator) erhalten. Was mich verwirrt ist, dass ich meines Wissens keinen Inhaltskörper hinzugefügt habe, es sei denn, ich habe es versehentlich irgendwie getan. Mein Code ist unten (sehr einfach). Muss ich noch etwas tun, um .NET davon zu überzeugen, dass dies nur ein http GET ist?

Danke, 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
quelle

Antworten:

152

Erhalten Sie den Anforderungs-Stream nicht ganz einfach. GET-Anfragen haben normalerweise keine Körper (obwohl dies von HTTP technisch nicht verboten ist ) und WebRequestunterstützen sie nicht - aber genau dafür GetRequestStreamist das Aufrufen erforderlich , um Körperdaten für die Anfrage bereitzustellen.

Angesichts der Tatsache, dass Sie versuchen, aus dem Stream zu lesen , scheint es mir, dass Sie tatsächlich die Antwort erhalten und den Antwort-Stream daraus lesen möchten :

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
quelle
14
Technisch gesehen können GET-Anforderungen Körper haben, aber .NET unterstützt nicht das Generieren von GET-Anforderungen mit Körpern. stackoverflow.com/questions/2064281/…
mhud
1
@ JonSkeet Du musst ein Genie sein oder so. Genau das hat mein Problem gelöst. +1.
Ewiger Lernender
3
@EternalLearner Das hast du rückwärts. Der richtige Ausdruck ist: "Genie, du musst ein Skeet sein oder so." :) Das hat mich auch geklärt und ich habe dem Responder eine +1 gegeben, bevor mir klar wurde, dass ich Mr. Skeet auf 1M geholfen habe.
Dan Solovay
@ JonSkeet, gibt es eine Möglichkeit, eine GET-Anfrage mit einem Inhaltskörper mithilfe von HttpClientund zu senden HttpRequestMessage?
Shimmy Weitzhandler
@JonSkeet NM Ich habe meine Antwort hier .
Shimmy Weitzhandler
5

Ich hatte das ähnliche Problem mit 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.

Das Problem wurde .WithHeader("Content-Type", "application/json")beim Erstellen von IFlurlRequest verwendet.

flam3
quelle
2

Weil Sie den Header nicht angegeben haben.

Ich habe ein erweitertes Beispiel hinzugefügt:

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

Header (Ref-Anfrage, p_Method);

Und die Methode 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
quelle
-7

Bitte legen Sie den Inhaltstyp der Anforderung fest, bevor Sie den Antwortstrom lesen.

 request.ContentType = "text/xml";
Naveen Kumar
quelle