我的网络请求后,我的网络响应内容长度似乎始终为-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();
答案 0 :(得分:2)
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?
恩乔伊。