我正在尝试在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
)。
有人可以解释这种行为吗? (如果没有,建议解决方法?)
修改
问题可能与此片段在Task
中执行的事实有关,但到目前为止,我仍然知道这一点。
EDIT2
在UI线程上运行代码仍然会抛出相同的异常,所以也许这毕竟不是......
EDIT3
经过一夜好眠,我认为这可能是因为我没有正确地关闭我的回应或响应流。我在长时间运行的操作仍在忙时发送多个请求。我可以想象,如果你没有在这里妥善处理,那么在较低的水平上会有一个问题。但对我来说很难说,因为我不知道webrequest / webresponse类的内部工作原理。
我正在使用的代码:http://code.google.com/p/dune-api-codepack/source/browse/ApiWrappers/DuneCommands/CommandResult.vb(不是最新提交,但差异不是太大)
有问题的方法是GetResults(command)
。不介意GetResultsAsync
方法,它只是一个草稿(虽然它可能包含相同的错误)。
EDIT4
忽略我所说的一切,问题和解决方案在我的答案中。
答案 0 :(得分:0)
特别感谢@mellamokb试图与我一起解决问题,但解决方案实际上是你无法知道的。
在设置请求超时之前,我很愚蠢地将发布数据写入请求流。我想这就是你在累了的时候尝试编写代码所得到的。
再次感谢您的时间。