代码之家  ›  专栏  ›  技术社区  ›  Broam

为什么在执行HTTP POST时流的字节数不足?

  •  1
  • Broam  · 技术社区  · 15 年前

    这让我发疯:

        WebRequest request = WebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = Encoding.UTF8.GetByteCount(data);
        Stream reqs = request.GetRequestStream();
        StreamWriter stOut = new StreamWriter(reqs, Encoding.UTF8);
        stOut.Write(data);
        stOut.Flush();
    

    我得到一个异常,我在流中用完了字节…但是我使用了相同的编码来获得字节计数!

    使用ASCII这不会失败。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Marc Gravell    15 年前

    这可能是物料清单;尝试使用不带BOM表的显式编码:

    Encoding enc = new UTF8Encoding(false);
    ...
    request.ContentLength = enc.GetByteCount(data);
    ...
    StreamWriter stOut = new StreamWriter(reqs, enc);
    

    更容易;切换到 WebClient 而不是试图自己处理这一切;使用以下内容发布表单非常容易:

        using (var client = new WebClient())
        {
            var data = new NameValueCollection();
            data["foo"] = "123";
            data["bar"] = "456";
            byte[] resp = client.UploadValues(address, data);
        }
    

    还是用密码 from here :

      byte[] resp = client.Post(address, new {foo = 123, bar = 546});
    
        2
  •  1
  •   João Angelo    15 年前

    您也可以尝试以下方法:

    byte[] bytes = Encoding.UTF8.GetBytes(data);
    
    request.ContentLength = bytes.Length;
    request.GetRequestStream().Write(bytes, 0, bytes.Length);
    
        3
  •  1
  •   Hans Passant    15 年前

    不要忘记对数据进行URL编码,就像您在ContentType中承诺的那样。这是一条单行线:

    byte[] bytes = System.Web.HttpUtility.UrlEncodeToBytes(data, Encoding.UTF8);