この動詞タイプのコンテンツ本体を送信できません


95

.NET 2.0アプリ(Windows Mobile 6標準エミュレーターで実行)でこの例外(ProtocolViolationException)を受け取りました。私を混乱させるのは、私が知っている限り、何らかの方法で誤ってそれを行っていない限り、コンテンツ本文を追加していないということです。私のコードは以下にあります(非常に簡単です)。これが単なるGETであることを.NETに納得させるために他に必要なことはありますか?

ありがとう、ブライアン

//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要求はしていない通常(それはいていても体を持っている技術的に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リクエストの生成をサポートしていません。stackoverflow.com/questions/2064281/...
mhud

1
@JonSkeetあなたは天才か何かでなければなりません。それこそが私の問題を解決したものです。+1。
永遠の学習者2012年

3
@EternalLearnerそれは逆です。適切な表現は、「天才、あなたはスキートか何かでなければならない」です。:)これも私を整理しました、そして私が私がスキート氏を1Mに助けていることに気づく前に私はレスポンダーに+1を与えました。
Dan Solovay、2014年

@JonSkeet、HttpClientand を使用してコンテンツ本文を含むGETリクエストを送信する方法はありHttpRequestMessageますか?
Shimmy Weitzhandler 2018

@JonSkeet NM私はここで私の答えを得ました
Shimmy Weitzhandler 2018

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

Header(ref request、p_Method);

そしてメソッド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;
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.