48 votos

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

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

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

81voto

Jon Skeet Puntos 692016

No obtenga el flujo de solicitud, simplemente. Las solicitudes GET no suelen tener cuerpos (aunque técnicamente no está prohibido por HTTP) y WebRequest no lo soporta, pero para eso se llama GetRequestStream, para proporcionar datos de cuerpo para la solicitud.

Dado que está intentando leer del flujo, parece que en realidad quiere obtener la respuesta y leer el flujo 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);
        ...
    }
}

5voto

flam3 Puntos 387

Tuve un problema similar usando Flurl.Http:

Flurl.Http.FlurlHttpException: Llamada fallida. No se puede enviar un cuerpo de contenido con este tipo de verbo. GET http://******:8301/api/v1/agents/**** ---> System.Net.ProtocolViolationException: No se puede enviar un cuerpo de contenido con este tipo de verbo.

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

0voto

equiman Puntos 365

Porque no especificaste el encabezado.

He añadido un ejemplo extendido:

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

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

-1voto

Naveen Kumar Puntos 1

Por favor, establezca el tipo de contenido de la solicitud antes de leer el flujo de respuesta;

 request.ContentType = "text/xml";

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X