2012-05-14 1 views
2

Я пытаюсь установить почти бесконечное значение таймаута на 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

Игнорирование все, что я сказал, что проблема и решение в моем ответе ниже.

+1

Работает только для меня. Я создал поддельную страницу 'LongRunning.aspx', которая вызывает' Thread.Sleep' в течение произвольного количества секунд. Когда у меня есть спящий режим страницы на 150 секунд и нет 'request.Timeout', я получаю сообщение об ошибке, на которое вы ссылаетесь (так как время ожидания по умолчанию составляет 100 секунд). Однако, когда я использую ваш код и устанавливаю 'request.Timeout = Integer.MaxValue', он работает нормально, завершая запрос после ожидания 150 секунд. Можете ли вы попробовать работать с прокси, например [** Fiddler **] (http://www.fiddler2.com/fiddler2/), чтобы узнать, есть ли другая причина для закрытия соединения по трубопроводу? – mellamokb

+0

Хорошо, я покажу хороший старый проводник. –

+0

С сервера ничего не происходит, чтобы указать, что запрос был прерван. Что правильно, это никогда не отменяет операцию. Даже тогда, когда достигнут тайм-аут команды (как определено параметром запроса). Тем не менее вызов 'GetResponse' вызывает исключение ... –

ответ

0

Особая благодарность @mellamokb за попытку выяснить это со мной, но решение было фактически тем, что никто из вас не мог знать.

Я был настолько глуп, чтобы писать данные сообщения в requeststream перед установкой таймаута запроса. Наверное, это то, что вы пытаетесь написать код, когда устали.

Еще раз спасибо за ваше время.

 Смежные вопросы

  • Нет связанных вопросов^_^