No se puede enviar un cuerpo de contenido con este tipo de verbo


95

Acabo de recibir esta excepción (ProtocolViolationException) en mi aplicación .NET 2.0 (que se ejecuta en el emulador estándar de Windows Mobile 6). Lo que me confunde es que, hasta donde yo sé, no he agregado ningún cuerpo de contenido, a menos que lo haya hecho de alguna manera sin darme cuenta. Mi código está abajo (muy simple). ¿Hay algo más que deba hacer para convencer a .NET de que esto es solo un http GET?

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

Respuestas:


152

No obtenga el flujo de solicitudes, simplemente. Las solicitudes GET no suelen tener cuerpos (a pesar de que HTTP no lo prohíbe técnicamente ) y WebRequestno lo admiten, pero para eso es la llamada GetRequestStream, proporcionar datos corporales para la solicitud.

Dado que está tratando de leer de la transmisión, me parece que realmente desea obtener la respuesta y leer la transmisión de respuesta de eso:

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
Técnicamente, las solicitudes GET pueden tener cuerpos, pero .NET no admite la generación de solicitudes GET con cuerpos. stackoverflow.com/questions/2064281/…
mhud

1
@JonSkeet Debes ser un genio o algo así. Eso es exactamente lo que resolvió mi problema. +1.
Eternal Learner

3
@EternalLearner Lo tienes al revés. La expresión adecuada es: "Genio, debes ser un Skeet o algo así". :) Esto también me solucionó, y le di al respondedor un +1 antes de darme cuenta de que estaba ayudando al Sr. Skeet a 1M.
Dan Solovay

@JonSkeet, ¿hay alguna manera de enviar una solicitud GET con un cuerpo de contenido usando HttpClienty HttpRequestMessage?
Shimmy Weitzhandler

@JonSkeet NM Recibí mi respuesta aquí .
Shimmy Weitzhandler

5

Tuve un problema similar al usar 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.

El problema fue que utilicé .WithHeader("Content-Type", "application/json")al crear IFlurlRequest.


2

Porque no especificaste el encabezado.

He agregado un ejemplo extendido:

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

Encabezado (solicitud de referencia, p_Method);

Y el método 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

Establezca el tipo de contenido de la solicitud antes de leer el flujo de respuesta;

 request.ContentType = "text/xml";
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.