无法发送具有这种动词类型的内容主体


95

我刚刚在我的.NET 2.0应用程序(在Windows Mobile 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);

Answers:


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你有倒退。正确的表达是:“天才,您必须是Skeet之类的东西”。:)这也使我感到满意,在意识到我正在帮助Skeet先生升至1M之前,我给了响应者+1。
Dan Solovay

@JonSkeet,是否可以使用HttpClient和发送带有内容主体的GET请求HttpRequestMessage
Shimmy Weitzhandler,

@JonSkeet NM我在这里得到了答案。
Shimmy Weitzhandler '18

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

和方法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;
}

-7

在阅读响应流之前,请设置请求的内容类型;

 request.ContentType = "text/xml";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.