Impossibile inviare un corpo di contenuto con questo tipo di verbo


95

Ho appena ricevuto questa eccezione (ProtocolViolationException) nella mia app .NET 2.0 (in esecuzione sull'emulatore standard di Windows Mobile 6). Ciò che mi confonde è che, per quanto ne so, non ho aggiunto alcun corpo di contenuto, a meno che non l'abbia fatto inavvertitamente in qualche modo. Il mio codice è di seguito (molto semplice). C'è qualcos'altro che devo fare per convincere .NET che questo è solo un http GET?

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

Risposte:


152

Non ottenere il flusso di richieste, semplicemente. Le richieste GET di solito non hanno corpi (anche se non è tecnicamente proibito da HTTP ) e WebRequestnon lo supportano, ma questo è ciò che chiamaGetRequestStream serve la , fornendo i dati del corpo per la richiesta.

Dato che stai cercando di leggere dal flusso, mi sembra che tu voglia effettivamente ottenere la risposta e leggere il flusso di risposta da quello:

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

14
Tecnicamente, le richieste GET possono avere corpi, ma .NET non supporta la generazione di richieste GET con corpi. stackoverflow.com/questions/2064281/...
mhud

1
@ JonSkeet Devi essere un genio o qualcosa del genere. Questo è esattamente ciò che ha risolto il mio problema. +1.
Eternal Learner

3
@EternalLearner Hai quello al contrario. L'espressione corretta è: "Genio, devi essere uno Skeet o qualcosa del genere". :) Questo ha risolto anche me, e ho dato al risponditore un +1 prima di rendermi conto che stavo aiutando il signor Skeet a 1M.
Dan Solovay

@ JonSkeet, c'è un modo per inviare una richiesta GET con un corpo di contenuto utilizzando HttpCliente HttpRequestMessage?
Shimmy Weitzhandler

@ JonSkeet NM Ho avuto la mia risposta qui .
Shimmy Weitzhandler

5

Ho avuto il problema simile usando 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.

Il problema è stato utilizzato .WithHeader("Content-Type", "application/json")durante la creazione di IFlurlRequest.


2

Perché non hai specificato l'intestazione.

Ho aggiunto un esempio esteso:

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

Header (richiesta ref, p_Method);

E il metodo 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;
}

-7

Impostare il tipo di contenuto della richiesta prima di leggere il flusso di risposta;

 request.ContentType = "text/xml";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.