【问题标题】:HttpWebResponse contentLength always -1HttpWebResponse contentLength 始终为 -1
【发布时间】:2014-03-04 00:35:04
【问题描述】:

在我的网络请求之后,我的网络响应内容长度似乎总是 -1。我相信你的按摩和签名是对的。 我在这里做错了什么?

            string msg = string.Format("{0}{1}{2}", nonce, clientId, apiKey);
            string signature = ByteArrayToString(SignHMACSHA256(apiSecret, StrinToByteArray(msg))).ToUpper();
            const string endpoint = "https://www.bitstamp.net/api/balance/";
            HttpWebRequest request = WebRequest.Create(endpoint) as HttpWebRequest;
            request.Proxy = null;
            request.Method = "POST";
            request.ContentType = "application/xml";
            request.Accept = "application/xml";
            request.Headers.Add("key", apiKey);
            request.Headers.Add("signature", signature);
            request.Headers.Add("nonce", nonce.ToString());
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

【问题讨论】:

    标签: c# api httpwebrequest httpwebresponse bitcoin


    【解决方案1】:

    来自the documentation

    ContentLength 属性包含随响应返回的 Content-Length 标头的值。如果响应中未设置 Content-Length 标头,则将 ContentLength 设置为值 -1。

    【讨论】:

    • 是的,但这通常是由服务器处理的,所以大多数看到这个的人都会对原因感兴趣。对于大多数人来说,是我在下面描述的原因——返回正在流式传输或分块。
    【解决方案2】:

    让它使用 webClient 而不是 httpWebRequest。 如果有人可以让它与 httpWebRequest 一起工作,你就会得到答案。

                string msg = string.Format("{0}{1}{2}", nonce, clientId, apiKey);
                var signature = ByteArrayToString(SignHMACSHA256(apiSecret, StrinToByteArray(msg))).ToUpper();
                var path = "https://www.bitstamp.net/api/user_transactions/";
    
                using (WebClient client = new WebClient())
                {
    
                    byte[] response = client.UploadValues(path, new NameValueCollection()
                    {
                        { "key", apiKey },
                        { "signature", signature },
                        { "nonce", nonce.ToString()},
    
                    });
    
                    var str = System.Text.Encoding.Default.GetString(response);
                }
    

    【讨论】:

    • 这是有效的,因为您没有检查 Content-Length 标头。如果您为流创建 StreamReader 并将流读到末尾,您也可以使用 HttpWebRequest 进行此操作。
    【解决方案3】:

    因为这与“WebClient”一起工作,所以请求没有任何问题,这意味着几乎可以肯定该请求被发送回“分块”。这由标题“Transfer-Encoding”表示。

    网络服务器可能会发回分块的内容有几个原因,包括返回是二进制的。

    我来到这个页面是因为 Fiddler 正在“干扰”我的请求,即通过服务器将一个非常好的响应转而将其分块返回给我的客户端。那是因为我按下或激活了“流”按钮。如果不是,它会将数据发送回缓冲,从而保留来自服务器的响应。追踪这件事太可怕了..

    但研究确实告诉了我为什么 Content-Length 标头可能是 -1。

    解决方案?要么修复服务器(或在我的情况下为代理)发送响应的方式,要么只是将响应流读取到最后。后者会将所有块返回给您连接的,您可以获取返回的字节长度。

    Stream responseStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(responseStream);
    String responseString = reader.ReadToEnd();
    int responseLength = responseString.Length;
    

    如果你想要字节,它会更复杂——不确定是否有一个阅读器可以让你读到最后——二进制阅读器需要一个缓冲区。

    An elegant way to consume (all bytes of a) BinaryReader?

    开心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多