Я пытаюсь установить почти бесконечное значение таймаута на WebRequest
, считая, что HTTP-API, который я запрашиваю, уже любезно обрабатывает таймауты, отправив обратно XML-документ, объявляющий тайм-аут. По некоторым причинам, хотя, следующий код все еще бросает исключение:WebRequest.GetResponse игнорирует мое значение тайм-аута?
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, это то, как сделать это. Тем не менее, я все равно получаю WebException примерно через 100 секунд (сообщение: The operation has timed out
, статус: WebExceptionStatus.Timeout
).
Может кто-нибудь объяснить это поведение? (А если нет, предложить обходной путь?)
EDIT
Проблема, вероятно, что-то делать с тем фактом, что этот фрагмент кода выполняется в Task
, но до сих пор, что до сих пор все, что я знаю.
EDIT2
Выполнение кода в потоке пользовательского интерфейса по-прежнему бросает то же исключение, поэтому, возможно, что это не его все-таки ...
EDIT3
После хорошего сна ночью , Я думаю, что это может быть сделано, потому что я не закрываю свои ответы или потоки ответов. Я отправляю несколько запросов, пока длительная работа все еще занята. Я могу себе представить, что на более низком уровне есть добыча, если вы не правильно распоряжаетесь здесь. Но для меня это трудно сказать, потому что я не знаю внутренней работы классов webrequest/webresponse.
код, который я использую: http://code.google.com/p/dune-api-codepack/source/browse/ApiWrappers/DuneCommands/CommandResult.vb (не последний коммит, но эти различия не слишком велики)
Проблемный метод GetResults(command)
. Не обращайте внимание на метод GetResultsAsync
, это всего лишь черновик (хотя он, вероятно, содержит ту же ошибку).
EDIT4
Игнорирование все, что я сказал, что проблема и решение в моем ответе ниже.
Работает только для меня. Я создал поддельную страницу 'LongRunning.aspx', которая вызывает' Thread.Sleep' в течение произвольного количества секунд. Когда у меня есть спящий режим страницы на 150 секунд и нет 'request.Timeout', я получаю сообщение об ошибке, на которое вы ссылаетесь (так как время ожидания по умолчанию составляет 100 секунд). Однако, когда я использую ваш код и устанавливаю 'request.Timeout = Integer.MaxValue', он работает нормально, завершая запрос после ожидания 150 секунд. Можете ли вы попробовать работать с прокси, например [** Fiddler **] (http://www.fiddler2.com/fiddler2/), чтобы узнать, есть ли другая причина для закрытия соединения по трубопроводу? – mellamokb
Хорошо, я покажу хороший старый проводник. –
С сервера ничего не происходит, чтобы указать, что запрос был прерван. Что правильно, это никогда не отменяет операцию. Даже тогда, когда достигнут тайм-аут команды (как определено параметром запроса). Тем не менее вызов 'GetResponse' вызывает исключение ... –