Ne peut pas envoyer un corps de contenu avec ce type de verbe

je viens de recevoir cette exception (ProtocolViolationException) dans mon application .net 2.0 (fonctionnant sur Windows mobile 6 émulateur standard). Ce qui me trouble, c'est que pour autant que je sache, je n'ai ajouté aucun corps de contenu, à moins que je ne l'ai fait par inadvertance d'une façon ou d'une autre. Mon code est ci-dessous (très simple). Y a-t-il autre chose que je dois faire pour convaincre .NET que ce n'est qu'un accès http?

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);
76
demandé sur Yuval Itzchakov 2010-10-20 23:28:56

3 réponses

Ne faites pas la demande de flux, tout simplement. Les requêtes GET ne sont pas habituellement ont des corps (même si c'est qui n'est pas techniquement interdit par HTTP ) et WebRequest ne le supporte pas - mais c'est à cela que sert l'appel GetRequestStream , fournissant des données corporelles 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);
        ...
    }
}
125
répondu Jon Skeet 2017-05-23 12:18:24

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

de l'en-Tête(réf demande, p_Method);

et L'en-tête de la méthode:

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;
}
2
répondu equiman 2014-07-05 14:15:35

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

 request.ContentType = "text/xml";
-3
répondu Naveen Kumar 2013-04-23 07:48:38