2

我正在尝试在 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

忽略我所说的一切,问题和解决方案在我下面的答案中。

4

1 回答 1

0

特别感谢@mellamokb 试图与我一起解决这个问题,但解决方案实际上是你们都不知道的。

在设置请求超时之前,我很愚蠢地将发布数据写入请求流。我想这就是你在疲倦时尝试编写代码的结果。

感谢你的宝贵时间。

于 2012-05-15T14:50:40.770 回答