【问题标题】:How do I properly post data using the HttpWebRequest in C#如何在 C# 中使用 HttpWebRequest 正确发布数据
【发布时间】:2015-01-29 12:18:03
【问题描述】:

我在 .Net Micro Framework 中使用 HttpWebRequest 方法。我正在尝试使用以下方法将数据发布到另一台服务器。我得到以下信息:

例外:

“System.Net.ProtocolViolationException:HTTP 方法不正确:GET”错误。

堆栈跟踪:

System.Net.HttpWebRequest::ValidateGetRequestStream System.Net.HttpWebRequest::GetRequestStream

这个异常是否告诉我我应该在进行 POST 时进行 GET ?如果是这样,我有 request.Method = "POST" 那么是什么导致它使用 GET ?

                    HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(@"http://192.168.2.1:3322/home/PostEvent");
                    Stream dataStream = webReq.GetRequestStream();

                    UTF8Encoding enc = new UTF8Encoding();
                    byte[] data = UTF8Encoding.UTF8.GetBytes(strMachineEvt.ToString());

                    dataStream.Write(data, 0, data.Length);
                    dataStream.Close();

                    webReq.Method = "POST";
                    webReq.ContentType = "application/json";
                    webReq.ContentLength = data.Length;

                    WebResponse response = webReq.GetResponse();

                    //HttpWebResponse resp = (HttpWebResponse)webReq.GetResponse();

                    Debug.Print(((HttpWebResponse)response).StatusDescription);
                    Stream respData = response.GetResponseStream();
                    StreamReader reader = new StreamReader(dataStream);

                    string responseFromServer = reader.ReadToEnd();
                    // Display the content.
                    Debug.Print(responseFromServer);
                    // Clean up the streams.
                    reader.Close();
                    dataStream.Close();
                    response.Close();

【问题讨论】:

    标签: c# .net-micro-framework netduino


    【解决方案1】:

    那个例外是documented in HttpWebRequest.GetRequestStream():

    Method 属性是 GET 或 HEAD。

    因此,只需在调用GetRequestStream() 之前将方法设置为“POST”

    【讨论】:

      【解决方案2】:

      为了发帖,请随意使用以下代码:

      var request            = (HttpWebRequest)WebRequest.Create(Url);
      byte[] byteArray       = Encoding.UTF8.GetBytes(YourParametersString);
      
      request.Method         = WebRequestMethods.Http.Post;
      request.ContentLength  = byteArray.Length;
      request.ContentType    = "application/json";
      
      Stream postStream      = request.GetRequestStream();
      
      postStream.Write(byteArray, 0, byteArray.Length);
      postStream.Close();
      

      现在,如果您需要验证并从服务器获取答案或状态:

      using (var response = (HttpWebResponse)request.GetResponse()){
          var responseValue = string.Empty;
      
          // Error
          if (response.StatusCode != HttpStatusCode.OK){
              var message = String.Format("Request failed. Received HTTP {0}", response.StatusCode);
              throw new ApplicationException(message);
          }
      
          // Grab the response
          using (var responseStream = response.GetResponseStream()){
              if (responseStream != null){
                  using (var reader = new StreamReader(responseStream)){
                      responseValue = reader.ReadToEnd();
                  }
              }
          }
      }
      

      【讨论】:

      • “随意使用” 听起来好像您编写了这段代码并想分享它。 SO 不是一个 sn-p 共享网站;是为了解决具体问题。这里的问题是 OP 有一段代码可以工作 99%,使它工作所需的唯一更改就是执行我在回答中提到的操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 2013-01-20
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      相关资源
      最近更新 更多