обработка тайм-аута веб-запроса?

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    var result = reader.ReadToEnd();
    // Do something with result
}

В приведенном выше примере у меня определен тайм-аут, и если произойдет тайм-аут, как я узнаю, что результат будет пустым?

Получу ли я какие-либо типы ответов?

Как я могу убедиться, что время истекло?


person Prix    schedule 08.03.2011    source источник


Ответы (3)


GetResponse() вызовет исключение WebException. Тем не менее, проверить точно, что происходит, просто — установите время ожидания на 1 мс и попробуйте нажать что-нибудь, что требует времени для возврата.

Фактически, в документации это прямо указано:

Если период ожидания истекает до того, как ресурс может быть возвращен, создается исключение WebException.

person Jon Skeet    schedule 08.03.2011
comment
спасибо, это то, что я искал, я не был полностью уверен. - person Prix; 08.03.2011

Ваш вызов HttpWebRequest.GetResponse вызовет WebException, когда;

Abort was previously called.    
-or-    
The time-out period for the request expired.
-or-    
An error occurred while processing the request.

Перехватите это исключение.

Раньше я просто вытягивал свой сетевой кабель, чтобы протестировать подобные вещи, хотя вы могли бы быть более элегантным и использовать прокси-инструмент и заблокировать этот конкретный запрос.

person Dave Anderson    schedule 08.03.2011
comment
Спасибо, The time-out period for the request expired. помогло. - person Prix; 08.03.2011

Вероятно, вам следует использовать HTTPWebResponse. Он имеет код состояния, который сообщает вам эту информацию и многое другое. HTTPWebResponse является потомком WebResponse.

person Tony Abrams    schedule 08.03.2011