设置StackyClient超时

时间:2013-09-30 15:14:06

标签: c# timeout httpwebrequest stacky

我使用StackyClient库来循环Stack Overflow中的最新问题。通常这有效:

StackyClient client = new StackyClient("1.1", "", Sites.MetaStackOverflow, new UrlClient(), new JsonProtocol());
var o = new QuestionOptions();
...
IPagedList<Question> l = null;
while (!stop) {   
   l = client.GetQuestions(o);
   var newQuestions = (from Question q in l                      
                       orderby q.Id descending
                       select q).ToList();
   ...
}

但在某些时候,这似乎失败了。也许是由于网络连接问题或者我不知道是什么。该程序挂起client.GetQuestions(o)

我想检测到这个问题并重新连接。 我想过以某种方式设置超时以防止程序挂起。怎么办呢?

1 个答案:

答案 0 :(得分:1)

这里有两个可能的答案:

  1. 你确定这是悬挂的吗?你是否在调试器下运行它并确保它没有抛出未捕获的异常?您是否检查过ProcessExplorer和/或Fiddler以查看请求和套接字是否仍处于打开状态?对我而言,套接字似乎更有可能被关闭,或者你得到了一个异常并且它没有被抓住。
  2. 如果确认这是挂在GetQuestions上,那么对代码的审查表明你必须要求Stacky的作者实现这个功能,否则你将不得不自己实现它...据我所知,这个特征今天不存在。
  3. 在Stacky的UrlClient.cs中有一个对HttpWebRequest.GetResponse的阻塞调用,并且在响应流上有一个对ReadToEnd的阻塞调用。没有为任何一个调用设置超时,也没有为HttpWebRequest对象本身设置超时:

    Stacky/UrlClient.cs

    另外,我没有在connectionManagement设置中看到任何允许在响应上设置超时并从HttpWebRequest的响应流中读取的内容:

    connectionManagement setting

    Stack UrlClient代码重新抛出404和407以外的WebExceptions(需要代理身份验证),所以如果你从StackOverflow得到一个408(服务器计时你出去)它会抛出Stacky GetQuestions调用,这是为什么我怀疑你可能会看到一个未被捕获的异常,而不是一个悬念。

    我只是在Chrome浏览器中浏览问题时会定期看到来自StackOverflow的408,因此您的程序可能会发生这种情况,您只需要捕获异常并在延迟后重试。

    希望这会有所帮助 - 哈罗德