我编写了一个简单的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。恰好适合4个请求和响应。但是之后,下面的行将引发“System.Net.WebException”,并指出“操作已超时”:
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

这是事实:
  • 捕获异常并重新绑定(bind)会继续导致相同的异常
  • 默认的HttpWebRequest .Timeout和.ReadWriteTimeout已经足够高(超过一分钟)
  • 将HttpWebRequest.KeepAlive更改为false并没有解决任何问题
  • 它似乎始终在浏览器中运行,即使该函数失败
  • https://www.google.com
  • 检索响应没有问题
  • 每天异常(exception)发生之前成功响应的数量(但浏览器始终有效)
  • 从上次失败的交易编号开始的
  • 立即导致异常
  • 从主线程调用此函数仍然导致
  • 异常
  • 在另一台机器上运行不起作用
  • 从其他IP运行
  • 无效
  • 在请求之间增加Thread.Sleep对
  • 没有帮助

    关于什么可能是错的任何想法?

    最佳答案

    我有同样的问题。
    对我来说,解决方法很简单,就像将HttpWebResponse代码包装在using块中一样。

    using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
    {
        // Do your processings here....
    }
    

    详细信息:当向同一主机发出多个请求,并且WebResponse没有正确处理时,通常会发生此问题。在那里using块将正确地正确放置WebResponse对象,从而解决了问题。

    10-06 06:11