108 votes

Impossible d'envoyer un contenu avec ce type de verbe

Je viens de recevoir cette exception (ProtocolViolationException) dans mon application .NET 2.0 (exécutée sur l'émulateur windows mobile 6 standard). Ce qui me perturbe, c'est que, autant que je sache, je n'ai pas ajouté de contenu, à moins de l'avoir fait involontairement. Mon code est ci-dessous (très simple). Y a-t-il autre chose que je dois faire pour convaincre .NET que c'est juste une requête http GET?

//run get and grab response
WebRequest request = WebRequest.Create(get.AbsoluteUri + args);
request.Method = "GET";
Stream stream = request.GetRequestStream();           // <= explose ici
XmlTextReader reader = new XmlTextReader(stream);

175voto

Jon Skeet Points 692016

Ne récupérez pas le flux de la requête, tout simplement. Les requêtes GET n'ont généralement pas de corps (bien que ce ne soit pas techniquement interdit par HTTP) et WebRequest ne le prend pas en charge - mais c'est à cela que sert l'appel de GetRequestStream, pour fournir les données du corps de la requête.

Étant donné que vous essayez de lire à partir du flux, il me semble que vous voulez en fait 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);
        ...
    }
}

17 votes

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/…

1 votes

@JonSkeet Vous devez être un génie ou quelque chose comme ça. C'est exactement ce qui a résolu mon problème. +1.

4 votes

@EternalLearner Tu as tout faux. L'expression correcte est : "Génie, tu dois être un Skeet ou quelque chose comme ça." :) Cela m'a également aidé, et j'ai donné un +1 au répondant avant de réaliser que j'aidais M. Skeet à atteindre 1M.

5voto

flam3 Points 422

J'ai eu un problème similaire en utilisant Flurl.Http:

Flurl.Http.FlurlHttpException: L'appel a échoué. Impossible d'envoyer un corps de contenu avec ce type de verbe. GET http://******:8301/api/v1/agents/**** ---> System.Net.ProtocolViolationException: Impossible d'envoyer un corps de contenu avec ce type de verbe.

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

2voto

equiman Points 365

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());

Header(ref request, 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;
}

-8voto

Naveen Kumar Points 1

Veuillez définir le type de contenu de la requête avant de lire le flux de réponse;

 request.ContentType = "text/xml";

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X