ไม่สามารถส่งเนื้อหา - เนื้อหาด้วยคำกริยาประเภทนี้


96

ฉันเพิ่งได้รับข้อยกเว้นนี้ (ProtocolViolationException) ในแอป. NET 2.0 ของฉัน (ทำงานบนโปรแกรมจำลองมาตรฐาน windows mobile 6) สิ่งที่ทำให้ฉันสับสนก็คือเท่าที่ฉันรู้ฉันยังไม่ได้เพิ่มเนื้อหาใด ๆ เว้นแต่ฉันจะทำมันโดยไม่ได้ตั้งใจ รหัสของฉันอยู่ด้านล่าง (ง่ายมาก) มีอะไรอีกไหมที่ฉันต้องทำเพื่อโน้มน้าว. NET ว่านี่เป็นเพียง http GET?

ขอบคุณไบรอัน

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

คำตอบ:


152

อย่ารับสตรีมคำขอค่อนข้างเรียบง่าย คำขอ GET มักไม่มีเนื้อความ (แม้ว่าHTTPWebRequestจะไม่ได้รับอนุญาตทางเทคนิคก็ตาม) และไม่รองรับ - แต่นั่นคือสิ่งที่เรียกGetRequestStreamเพื่อให้ข้อมูลเนื้อหาสำหรับคำขอ

เนื่องจากคุณกำลังพยายามอ่านจากสตรีมสำหรับฉันดูเหมือนว่าคุณต้องการได้รับคำตอบและอ่านสตรีมตอบกลับจากสิ่งนั้นจริงๆ:

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
ในทางเทคนิคคำขอ GET สามารถมีเนื้อความได้ แต่. NET ไม่สนับสนุนการสร้าง GET reqeusts กับร่างกาย stackoverflow.com/questions/2064281/…
mhud

1
@JonSkeet คุณต้องเป็นอัจฉริยะหรืออะไรสักอย่าง นั่นคือสิ่งที่ช่วยแก้ปัญหาของฉันได้ +1.
Eternal Learner

3
@EternalLearner คุณมีความหลัง การแสดงออกที่เหมาะสมคือ "อัจฉริยะคุณต้องเป็น Skeet หรืออะไรสักอย่าง" :) สิ่งนี้ก็ทำให้ฉันเข้าใจเช่นกันและฉันให้ +1 แก่ผู้ตอบก่อนที่ฉันจะรู้ว่าฉันกำลังช่วยนาย Skeet ถึง 1M
Dan Solovay

@JonSkeet มีวิธีส่งคำขอ GET พร้อมเนื้อหาโดยใช้HttpClientและHttpRequestMessageหรือไม่
Shimmy Weitzhandler

@JonSkeet NM ผมได้คำตอบของฉันที่นี่
Shimmy Weitzhandler

5

ฉันมีปัญหาที่คล้ายกันโดยใช้ 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.

ฉันใช้ปัญหา.WithHeader("Content-Type", "application/json")เมื่อสร้าง IFlurlRequest


2

เนื่องจากคุณไม่ได้ระบุส่วนหัว

ฉันได้เพิ่มตัวอย่างเพิ่มเติม:

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

ส่วนหัว (ref request, p_Method);

และส่วนหัวของวิธีการ:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.