HttpWebResponse CONTENTLENGTH总是-1(HttpWebResponse

2019-10-19 07:17发布

我的网络响应的内容长度似乎总是-1我的Web请求后。 我敢肯定你按摩和签名是正确的。 我在做什么错在这里?

            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();

Answer 1:

从文档 ,

所述的ContentLength属性包含与响应中返回的的ContentLength标头的值。 如果的ContentLength头没有在响应中设置,的ContentLength被设置为值-1。



Answer 2:

得到它与Web客户端,而不是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);
            }


Answer 3:

因为这与“Web客户端”的工作,没有什么不对的请求,这意味着几乎可以肯定的是,请求被发送回“分块”。 这是由报头“传送编码”表示。

为什么有Web服务器会发送回分块的东西,包括一个事实,即回报是二进制的几个原因。

我来到这个页面,因为提琴手被“干扰”与转向服务器一个非常好的响应,然后返回它分块给我的客户我的要求。 那是因为我有“流”按钮按下或活动。 当它不是时,它发送回缓冲其保留来自服务器的响应中的数据。 这是追查一个可怕的事情..

但研究却告诉我,为什么Content-Length头可能是-1。

解决方案? 请修复服务器(或代理在我的情况)被发送响应回来的路上,或者只是读取响应流进行到底。 后者将返回所有块给你连接,你可以返回的字节的长度。

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

如果你想字节是更复杂 - 不知道是否有一个阅读器,可以读取到最后 - 二进制读者需要一个缓冲了前面。

一个优雅的方式来消耗BinaryReader在(的所有字节)?

恩乔伊。



文章来源: HttpWebResponse contentLength always -1