2010-10-20 15 views
68

Je viens de recevoir cette exception (ProtocolViolationException) dans mon application .NET 2.0 (exécutée sur l'émulateur standard de Windows Mobile 6). Ce qui m'embrouille, c'est que pour autant que je sache, je n'ai ajouté aucun corps de contenu, sauf si je l'ai fait par inadvertance d'une manière ou d'une autre. Mon code est ci-dessous (très simple). Y at-il autre chose que je dois faire pour convaincre .NET que c'est juste un http GET?Impossible d'envoyer un corps de contenu avec ce type de verbe

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

Répondre

111

Ne pas obtenir le flux de demande, tout simplement. Les requêtes GET n'ont généralement pas de corps (même si c'est not technically prohibited by HTTP) et WebRequest ne le supporte pas - mais c'est pour cela que l'on appelle GetRequestStream, en fournissant des données de corps pour la requête.

Étant donné que vous essayez de lire du flux, il me semble que vous voulez vraiment obtenir le réponse et lire le flux de réponse de cette:

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); 
     ... 
    } 
} 
+0

en effet c'est exactement ce que je voulais faire. Merci. –

+10

Techniquement, les requêtes GET peuvent avoir des corps, mais .NET ne supporte pas la génération de requêtes GET avec des corps. http://stackoverflow.com/questions/2064281/sending-post-data-with-get-request-valid – mhud

+1

@mhud: Merci, va éditer. –

2

Parce que vous didn Ne spécifiez pas l'en-tête.

J'ai ajouté un exemple étendu:

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

tête (requête ref, p_Method);

Et la méthode en-tête:

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; 
} 
-3

S'il vous plaît définir le type de contenu de la demande avant de lire le flux de réponse;

request.ContentType = "text/xml";