【问题标题】:Cannot send a content-body with this verb-type无法发送具有此动词类型的内容主体
【发布时间】:2011-04-28 05:59:44
【问题描述】:

我刚刚在我的 .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);

【问题讨论】:

    标签: .net webrequest


    【解决方案1】:

    我在使用 Flurl.Http 时遇到了类似的问题:

    Flurl.Http.FlurlHttpException: Call failed. Cannot send a content-body with this verb-type. GET http://******:8301/api/v1/agents/**** ---&gt; System.Net.ProtocolViolationException: Cannot send a content-body with this verb-type.

    问题是我在创建 IFlurlRequest 时使用了.WithHeader("Content-Type", "application/json")。

    【讨论】:

      【解决方案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;
      }
      

      【讨论】:

        【解决方案3】:

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

         request.ContentType = "text/xml";
        

        【讨论】:

          【解决方案4】:

          不要得到请求流,很简单。 GET 请求通常没有正文(即使它是 not technically prohibited by 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);
                  ...
              }
          }
          

          【讨论】:

          • 从技术上讲,GET 请求可以有主体,但 .NET 不支持生成带有主体的 GET 请求。 stackoverflow.com/questions/2064281/…
          • @JonSkeet 你一定是个天才什么的。这正是解决我的问题的原因。 +1。
          • @EternalLearner 你倒退了。正确的表达是,“天才,你一定是飞碟什么的。” :) 这也解决了我的问题,在我意识到我正在帮助 Skeet 先生达到 1M 之前,我给了响应者一个 +1。
          • @JonSkeet,有没有办法使用HttpClient 和HttpRequestMessage 发送带有内容主体的GET 请求?
          • @JonSkeet NM 我得到了答案here。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多