इस क्रिया-प्रकार के साथ एक सामग्री-निकाय नहीं भेजा जा सकता


96

मैं सिर्फ अपने .NET 2.0 ऐप (विंडोज़ मोबाइल 6 मानक एमुलेटर पर चल रहा है) में यह अपवाद (ProtocolViolationException) मिला। मुझे क्या भ्रमित करता है कि जहां तक ​​मुझे पता है, मैंने कोई भी कंटेंट बॉडी नहीं जोड़ा है, जब तक कि मैंने अनजाने में इसे किसी तरह पूरा नहीं किया है। मेरा कोड नीचे है (बहुत सरल)। क्या मुझे .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

अनुरोध स्ट्रीम नहीं मिलता है, काफी सरलता से। जीईटी अनुरोधों में आमतौर पर निकाय नहीं होते हैं (भले ही यह तकनीकी रूप से HTTP द्वारा निषिद्ध नहीं है ) और WebRequestइसका समर्थन नहीं करता है - लेकिन यह कॉलिंग 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);
        ...
    }
}

14
तकनीकी रूप से, GET अनुरोधों में निकाय हो सकते हैं, लेकिन .NET निकायों के साथ GET reqeusts बनाने का समर्थन नहीं करता है। stackoverflow.com/questions/2064281/…
mhud

1
@JonSkeet आपको एक जीनियस या कुछ होना चाहिए। बस इसी से मेरी समस्या हल हो गई। +1।
अनन्त शिक्षार्थी

3
@EternalLearner आपके पास वह पीछे है। उचित अभिव्यक्ति है, "प्रतिभाशाली, आपको एक स्कीट या कुछ होना चाहिए।" :) इसने मुझे भी हल कर दिया, और मैंने जवाब दिया कि मैं 1 स्कीटर को 1M करने में मदद कर रहा था, इससे पहले कि मैंने महसूस किया कि एक +1 मिला।
डैन सोलोवे

@JonSkeet, क्या सामग्री बॉडी का उपयोग करके GET अनुरोध भेजने का एक तरीका है HttpClientऔर HttpRequestMessage?
शिम्मी वेइटहैंडलर

@JonSkeet NM मुझे यहाँ अपना उत्तर मिला ।
शिम्मी वेइटहैंडलर

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

हेडर (रेफ अनुरोध, 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;
}

-7

प्रतिक्रिया स्ट्रीम पढ़ने से पहले कृपया अनुरोध सामग्री प्रकार सेट करें;

 request.ContentType = "text/xml";
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.