Bu fiil türüyle içerik gövdesi gönderilemez


96

NET 2.0 uygulamamda (Windows mobile 6 standart öykünücüsü üzerinde çalışan) bu istisnayı (ProtocolViolationException) yeni aldım. Kafamı karıştıran şey, bildiğim kadarıyla, istemeden bir şekilde yapmadığım sürece herhangi bir içerik gövdesi eklememiş olmam. Kodum aşağıda (çok basit). .NET'i bunun sadece bir http GET olduğuna ikna etmek için yapmam gereken başka bir şey var mı?

Teşekkürler 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);

Yanıtlar:


152

Sadece istek akışını almayın. GET isteklerinin genellikle gövdesi yoktur ( HTTP tarafından teknik olarak yasaklanmamış olsa da ) ve WebRequestbunu desteklemez - ancak GetRequestStreamistek için gövde verileri sağlamak için çağrı bunun içindir.

Akıştan okumaya çalıştığınız göz önüne alındığında, aslında yanıtı almak ve bundan yanıt akışını okumak istiyormuşsunuz gibi görünüyor :

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

15
Teknik olarak, GET isteklerinin gövdeleri olabilir, ancak .NET, gövdelerle GET istekleri oluşturmayı desteklemez. stackoverflow.com/questions/2064281/…
mhud

1
@JonSkeet Bir dahi olmalısın. Sorunumu çözen tam olarak buydu. +1.
Ebedi Öğrenci

3
@EternalLearner Geriye doğru var. Doğru ifade şudur: "Dahi, bir Skeet falan olmalısın." :) Bu beni de çözdü ve Bay Skeet'e 1 milyona yardım ettiğimi fark etmeden önce yanıtlayana +1 verdim.
Dan Solovay

@JonSkeet, HttpClientve kullanarak bir içerik gövdesi ile GET isteği göndermenin bir yolu var HttpRequestMessagemı?
Shimmy Weitzhandler

@JonSkeet NM Cevabımı burada aldım .
Shimmy Weitzhandler

5

Flurl.Http kullanarak benzer bir sorun yaşadım:

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.

Sorun, .WithHeader("Content-Type", "application/json")IFlurlRequest'i oluştururken kullandım.


2

Çünkü Başlığı belirtmediniz.

Genişletilmiş bir örnek ekledim:

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

Üstbilgi (ref isteği, p_Method);

Ve yöntem Başlığı:

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

Lütfen yanıt akışını okumadan önce istek İçerik Türünü ayarlayın;

 request.ContentType = "text/xml";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.