2014-02-06 136 views
1

我的网络请求后,我的网站响应内容长度总是似乎为-1。我相信你的按摩和签名是正确的。 我在这里做错了什么?HttpWebResponse contentLength始终为-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(); 

回答

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); 
      } 
+0

这可以工作,因为您不检查Content-Length标头。如果为流创建StreamReader并将流读到最后,您也可以使用HttpWebRequest进行此项工作。 –

2

the documentation

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

+0

确实如此,但这通常由服务器负责,因此大多数看到此情况的人都对这个原因感兴趣。对于大多数人来说,我在下面描述的原因是 - 返回正在流式传输或分块。 –

0

因为这与“Web客户端”的工作,没有什么不对的请求,这意味着几乎可以肯定的是,请求被发送回“分块”。这由标题'Transfer-Encoding'表示。

Web服务器可能发回一些分块的原因有几个原因,包括返回是二进制的。

我来到这个页面是因为Fiddler通过服务器转向一个非常好的响应来“干扰”我的请求,然后将它返回给我的客户端。那是因为我有'流'按钮被按下或活动。如果不是,则它将数据发送回缓冲区,以保留服务器的响应。这是一个可怕的事情追查..

但研究确实告诉我为什么内容长度标题可能是-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?

恩乔伊。