WebException: выделение TimeoutExceptions

1

У меня многопоточная операция, которая выполняет ряд задач. Проблема, с которой я сталкиваюсь, - это веб-сервис, который может вернуть тайм-аут при сильном стрессе.

Когда при сильном напряжении (Тайм-аут), я хочу, чтобы функция повторила

Try
{
   // Do some actions here
} 
catch(WebException ex)
{
   if (// Timeout)
   { //Retry }
   else
   { // return error }
}
catch(Exception ex)
{ //return error }

От MSDN. Webexception может возникать в следующих ситуациях:

  • Ранее было отменено прерывание.
  • Время ожидания запроса истекло.
  • При обработке запроса произошла ошибка.

Вопрос: В моей обработке исключений, как можно разделить эти 3 причины и выделить TimeoutExceptions без использования сообщения?

Примечание. Я знаю, что могу просто увеличить timeout чтобы решить проблему. Но это не ставит в известность мое любопытство.

Спасибо за ваше время

  • 0
    Чтобы выделить TimeoutException, вы делаете перехват (TimeoutException ex) {...}
Теги:
multithreading

2 ответа

1
Лучший ответ

Вы можете проверить свойство Status по сравнению с одним из кодов статуса веб-запроса:

try {

}
catch(WebException ex) {
    if (ex.Status == WebExceptionStatus.Timeout) {
        // Retry logic
    }
    else {
        // return error
    }
}

См. Также этот пост для примера логики повтора. Обратите внимание, что Timeout - не единственная причина, которая должна вызвать повторную попытку (IMO также ConnectionFailure и ConnectionClosed, по крайней мере).

  • 1
    Сладкий кусок кода, который вы разместили там. Должно пригодиться. Спасибо за помощь мне. Должно быть, пропустил поле «Статус»
1

Вы можете посмотреть свойство Status Exception, которое будет содержать правильную причину исключения.

Поскольку вы используете какое-то время, связанное с поведением, если вы используете некоторые тесты в своем коде, я бы рекомендовал взглянуть на Reactive extensions; он позволяет настраивать цепочки событий, которые могут позволить вам легко тестировать желаемое поведение. Посмотрите на этот вопрос для примера, где я хотел, чтобы некоторые события повторялись, - это более высокая частота в случае ошибки, которая может вас заинтересовать.

  • 0
    Достаточно забавно, что ваш пост имеет дело с той же целью, которую мы пытаемся достичь. Интересное чтиво! Посмотрим на возможности Reactive Extensions

Ещё вопросы

Сообщество Overcoder
Наверх
Меню