Não é possível enviar um corpo de conteúdo com este tipo de verbo

95

Acabei de receber essa exceção (ProtocolViolationException) em meu aplicativo .NET 2.0 (em execução no emulador padrão do Windows Mobile 6). O que me confunde é que, até onde sei, não adicionei nenhum corpo de conteúdo, a menos que o tenha feito inadvertidamente de alguma forma. Meu código está abaixo (muito simples). Preciso fazer mais alguma coisa para convencer o .NET de que este é apenas um GET http?

Obrigado 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);
Brian Sweeney
fonte

Respostas:

152

Não obtenha o fluxo de solicitação, simplesmente. As solicitações GET geralmente não têm corpos (embora não sejam tecnicamente proibidas por HTTP ) e WebRequestnão as suportam - mas GetRequestStreamé para isso que serve a chamada , fornecendo dados corporais para a solicitação.

Visto que você está tentando ler o fluxo, parece-me que você realmente deseja obter a resposta e ler o fluxo de resposta a partir daí :

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);
        ...
    }
}
Jon Skeet
fonte
14
Tecnicamente, as solicitações GET podem ter corpos, mas o .NET não oferece suporte à geração de solicitações GET com corpos. stackoverflow.com/questions/2064281/…
mhud
1
@JonSkeet Você deve ser um gênio ou algo assim. Isso é exatamente o que resolveu meu problema. +1.
Eternal Learner
3
@EternalLearner Você entendeu ao contrário. A expressão adequada é: "Gênio, você deve ser um Skeet ou algo assim." :) Isso também me resolveu, e dei ao respondente um +1 antes de perceber que estava ajudando o Sr. Skeet a 1M.
Dan Solovay
@JonSkeet, há uma maneira de enviar uma solicitação GET com um corpo de conteúdo usando HttpCliente HttpRequestMessage?
Shimmy Weitzhandler
@JonSkeet NM Recebi minha resposta aqui .
Shimmy Weitzhandler
5

Tive o problema semelhante ao 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.

O problema foi que usei .WithHeader("Content-Type", "application/json")ao criar IFlurlRequest.

flam3
fonte
2

Porque você não especificou o cabeçalho.

Eu adicionei um exemplo estendido:

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

Cabeçalho (pedido de ref, p_Method);

E o 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;
}
equiman
fonte
-7

Defina o tipo de conteúdo da solicitação antes de ler o fluxo de resposta;

 request.ContentType = "text/xml";
Naveen Kumar
fonte