Tidak dapat mengirim isi-isi dengan tipe-kata kerja ini

96

Saya baru saja mendapatkan pengecualian ini (ProtocolViolationException) di aplikasi .NET 2.0 saya (berjalan di emulator standar windows mobile 6). Yang membingungkan saya adalah sejauh yang saya tahu, saya belum menambahkan isi konten apa pun, kecuali saya secara tidak sengaja melakukannya. Kode saya ada di bawah (sangat sederhana). Apakah ada hal lain yang perlu saya lakukan untuk meyakinkan. NET bahwa ini hanya http GET?

Terima kasih, 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
sumber

Jawaban:

152

Sederhananya, jangan dapatkan aliran permintaan. Permintaan GET biasanya tidak memiliki badan (meskipun secara teknis tidak dilarang oleh HTTP ) dan WebRequesttidak mendukungnya - tetapi untuk itulah pemanggilan GetRequestStream, menyediakan data tubuh untuk permintaan tersebut.

Mengingat Anda mencoba membaca dari aliran, sepertinya Anda benar-benar ingin mendapatkan respons dan membaca aliran respons dari itu:

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
sumber
14
Secara teknis, permintaan GET dapat memiliki badan, tetapi .NET tidak mendukung pembuatan persyaratan GET dengan badan. stackoverflow.com/questions/2064281/…
mhud
1
@JonSkeet Anda pasti jenius atau semacamnya. Persis itulah yang memecahkan masalah saya. +1.
Pelajar Abadi
3
@EternalLearner Anda memilikinya secara terbalik. Ekspresi yang tepat adalah, "Jenius, kamu pasti Skeet atau semacamnya." :) Ini juga menyortir saya, dan saya memberi responden +1 sebelum saya menyadari bahwa saya membantu Pak Skeet menjadi 1M.
Dan Solovay
@JonSkeet, apakah ada cara untuk mengirim permintaan GET dengan badan konten menggunakan HttpClientdan HttpRequestMessage?
Shimmy Weitzhandler
@JonSkeet NM Saya mendapat jawaban saya di sini .
Shimmy Weitzhandler
5

Saya mengalami masalah serupa saat menggunakan 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.

Masalahnya adalah saya digunakan .WithHeader("Content-Type", "application/json")saat membuat IFlurlRequest.

flam3
sumber
2

Karena Anda tidak menentukan Header.

Saya telah menambahkan contoh tambahan:

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

Header (permintaan ref, p_Method);

Dan metode 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
sumber
-7

Harap setel Jenis Konten permintaan sebelum Anda membaca aliran tanggapan;

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