我编写了一个简单的 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 (trade id) 开始获取数据(从一开始)。对于每个请求,我都会收到包含 1000 个交易详细信息的响应。我总是从上一个响应中为下一个请求发送交易 ID。它适用于恰好 4 个请求和响应。但在那之后,以下行抛出“System.Net.WebException”,表示“操作已超时”:
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
以下是事实:
- 捕获异常并重新绑定不断导致相同的异常
- 默认的 HttpWebRequest .Timeout 和 .ReadWriteTimeout 已经足够高(超过一分钟)
- 将 HttpWebRequest.KeepAlive 更改为 false 也没有解决任何问题
- 即使功能失败,它似乎也总是在浏览器中工作
- 从https://www.google.com检索响应没有问题
- 异常之前的成功响应数量每天都在变化(但浏览器始终有效)
- 从上次失败的交易 id 开始立即导致异常
- 从主线程调用此函数仍然导致异常
- 在另一台机器上运行它不起作用
- 从不同的 IP 运行它不起作用
- 在请求之间增加 Thread.Sleep 无济于事
有什么想法可能是错的吗?