我正在尝试在 a 上设置一个近乎无限的超时值WebRequest
,考虑到我正在查询的基于 HTTP 的 API 已经通过发回声明超时的 XML 文档来优雅地处理超时。但出于某种原因,以下代码仍然会引发异常:
Dim request As WebRequest = WebRequest.Create("http://api/cgi-bin/do?cmd=longRunningOperation&timeout=300")
' ^ command returns timeout if not complete within 300 seconds (5 minutes)
request.Timeout = Integer.MaxValue ' so we don't need client-side timeout handling
Dim response As WebResponse = request.GetResponse() ' yet this call blows up
很抱歉,我无法提供您可以调试的东西,但根据 MSDN,这是如何做到的。然而,大约 100 秒后我仍然收到 WebException(消息:The operation has timed out
,状态:) WebExceptionStatus.Timeout
。
有人可以解释这种行为吗?(如果没有,请提出解决方法?)
编辑
这个问题可能与这个片段是在 a 中执行的事实有关Task
,但到目前为止,这仍然是我所知道的。
编辑2
在 UI 线程上运行代码仍然会抛出相同的异常,所以也许毕竟不是这样......
编辑3
经过一夜好眠后,我认为它可能会这样做,因为我没有正确关闭我的响应或响应流。我正在发送多个请求,而长时间运行的操作仍然很忙。我可以想象,如果您没有在此处正确处理,则会出现较低级别的问题。但对我来说很难说,因为我不知道 webrequest/webresponse 类的内部工作原理。
我正在使用的代码:http ://code.google.com/p/dune-api-codepack/source/browse/ApiWrappers/DuneCommands/CommandResult.vb (不是最新的提交,但差异不是太大)
有问题的方法是GetResults(command)
。不要介意这个GetResultsAsync
方法,它只是一个草稿(尽管它可能包含相同的错误)。
编辑4
忽略我所说的一切,问题和解决方案在我下面的答案中。