我编写了一个简单的C#函数,通过以下API调用从MtGox获取交易历史:
https://data.mtgox.com/api/1/BTCUSD/trades?since=<trade_id>
这里记录了详细信息:https://en.bitcoin.it/wiki/MtGox/API/HTTP/v1#Multi_currency_trades
以下是函数:
string GetTradesOnline(Int64 tid)
{
Thread.Sleep(30000);
// communicate
string url = "https://data.mtgox.com/api/1/BTCUSD/trades?since=" + tid.ToString();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string json = reader.ReadToEnd();
reader.Close();
reader.Dispose();
response.Close();
return json;
}
我从 tid=0 (交易 ID) 开始获取数据(从一开始)。对于每个请求,我会收到包含 1000 条交易详情的响应。我始终将上一个响应中的交易 ID 发送给下一个请求。这对于恰好四个请求和响应正常工作。但是之后,下面这行代码会抛出一个“System.Net.WebException”,显示“操作已超时”:
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
以下是事实:
- 捕获异常并重新尝试会导致相同的异常
- 默认的HttpWebRequest.Timeout和.ReadWriteTimeout已经足够高(超过一分钟)
- 将HttpWebRequest.KeepAlive更改为false也没有解决任何问题
- 在浏览器中似乎总是工作正常,即使函数失败了
- 从https://www.google.com检索响应没有任何问题
- 成功响应的数量在异常之前每天都不同(但浏览器始终有效)
- 从上次失败的交易ID开始会立即引发异常
- 在主线程中调用此函数仍会导致异常
- 在不同的机器上运行无效
- 从不同的IP运行也无效
- 在请求之间增加Thread.Sleep时间不会有帮助
有什么想法是可能出了什么问题?