HttpWebResponse contentLength总是-1

时间:2014-02-06 20:36:13

标签: c# api httpwebrequest httpwebresponse bitcoin

我的网络请求后,我的网络响应内容长度似乎始终为-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();

3 个答案:

答案 0 :(得分:2)

来自the documentation

  

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

答案 1 :(得分:1)

使用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);
            }

答案 2 :(得分:0)

因为这与'WebClient'一起使用,所以请求没有任何问题,这几乎肯定意味着请求被发回'Chunked'。这由标题“Transfer-Encoding”表示。

有几个原因可以解释为什么网络服务器可能会发回一些块,包括返回为二进制的事实。

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

但研究确实告诉我为什么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?

恩乔伊。