Impossible d'envoyer un corps de contenu avec ce type de verbe

95

Je viens de recevoir cette exception (ProtocolViolationException) dans mon application .NET 2.0 (fonctionnant sur l'émulateur standard Windows Mobile 6). Ce qui me trouble, c'est que pour autant que je sache, je n'ai ajouté aucun corps de contenu, sauf si je l'ai fait par inadvertance. Mon code est ci-dessous (très simple). Dois-je faire autre chose pour convaincre .NET qu'il ne s'agit que d'un http GET?

Merci, 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
la source

Réponses:

152

N'obtenez pas le flux de demande, tout simplement. Les requêtes GET n'ont généralement pas de corps (même si ce n'est pas techniquement interdit par HTTP ) et WebRequestne le prend pas en charge - mais c'est à cela que GetRequestStreamsert l' appel , fournir des données de corps pour la requête.

Étant donné que vous essayez de lire à partir du flux, il me semble que vous voulez réellement obtenir la réponse et lire le flux de réponse à partir de cela:

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
la source
14
Techniquement, les requêtes GET peuvent avoir des corps, mais .NET ne prend pas en charge la génération de requêtes GET avec des corps. stackoverflow.com/questions/2064281/…
mhud
1
@JonSkeet Vous devez être un génie ou quelque chose comme ça. C'est exactement ce qui a résolu mon problème. +1.
Eternal Learner
3
@EternalLearner Vous avez cela à l'envers. L'expression appropriée est: "Génie, vous devez être un Skeet ou quelque chose comme ça." :) Cela m'a trié aussi, et j'ai donné un +1 au répondeur avant de réaliser que j'aidais M. Skeet à 1M.
Dan Solovay
@JonSkeet, existe-t-il un moyen d'envoyer une requête GET avec un corps de contenu en utilisant HttpClientet HttpRequestMessage?
Shimmy Weitzhandler
@JonSkeet NM J'ai eu ma réponse ici .
Shimmy Weitzhandler
5

J'ai eu le même problème avec 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.

Le problème était que j'avais utilisé .WithHeader("Content-Type", "application/json")lors de la création de IFlurlRequest.

flam3
la source
2

Parce que vous n'avez pas spécifié l'en-tête.

J'ai ajouté un exemple étendu:

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

En-tête (demande de référence, p_Method);

Et la méthode 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
la source
-7

Veuillez définir le type de contenu de la demande avant de lire le flux de réponse;

 request.ContentType = "text/xml";
Naveen Kumar
la source