【问题标题】:Set StackyClient Timeout设置 StackyClient 超时
【发布时间】:2013-09-30 15:14:05
【问题描述】:

我使用 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)

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

【问题讨论】:

    标签: c# timeout httpwebrequest stacky


    【解决方案1】:

    这里有两个可能的答案:

    1. 您确定这是挂起的吗?您是否在调试器下运行它并确保它没有抛出未捕获的异常?您是否检查过 ProcessExplorer 和/或 Fiddler 以查看请求和套接字是否仍然打开?在我看来,套接字被关闭或者您遇到异常并且没有被捕获的可能性更大。
    2. 如果确认这是在 GetQuestions 上挂起的,那么对代码的审查表明您必须要求 Stacky 的作者实现此功能,否则您将不得不自己实现它...据我所知,该功能今天不存在。

    在 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,因此这可能发生在您的程序中,您只需要捕获异常并在延迟后重试即可。

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

    【讨论】:

    • 你是对的。我没有正确捕捉到异常。现在就做,效果很好。
    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 2023-03-03
    • 2011-02-17
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多