Реализация шаблона повтора для временных исключений вызовов WCF

У меня есть очень простая служба WCF SOAP, которая вносит некоторые изменения в БД при каждом вызове и возвращает некоторый ответ. Я также использую ServiceChannel для вызова его из кода на стороне клиента.

Я хочу убедиться, что мой код на стороне клиента не дает сбой, когда служба слишком занята, поэтому реализовал Шаблон повторной попытки для повторной попытки вызова службы в случае обнаружения исключения. Однако я не хочу повторять попытку, если исключение вызвано моим кодом на стороне сервера WCF (если это не связано с подключением или если какой-либо код OperationContract был выполнен в любом случае (тайм-аут не не значит, что не было, верно?)).

Поэтому я хочу повторить попытку, только если

  1. я отправил запрос
  2. Поймал исключение
  3. Ни один код на стороне сервера в моем методе OperationContract не был выполнен

В статье Microsoft (ссылка выше) почти нет информации о том, какие именно типы исключений являются временными. Какие типы исключений следует использовать, чтобы поймать именно то, что мне нужно? Или как их фильтровать?


person Arsen Magomedov    schedule 25.09.2015    source источник
comment
Я не уверен, что вы когда-нибудь сможете узнать сторону клиента, если ни один код сервера не был выполнен. Если пакет пошел на сервер, но клиент не получил ответа, абсолютно невозможно узнать, что происходит на стороне сервера. Таким образом, в случае любого исключения повторная попытка имеет смысл, просто убедитесь, что вы правильно обрабатываете ответы, например, включая уникальные идентификаторы с сообщениями и сравнивая входящий идентификатор со списком ранее сохраненных идентификаторов.   -  person Wiktor Zychla    schedule 25.09.2015
comment
Я думаю, что упомянутая вами статья охватывает обработку исключения Transient. Вы взглянули на определение метода IsTransient(Exception ex). WebExceptionStatus.ConnectionClosed, WebExceptionStatus.Timeout, WebExceptionStatus.RequestCanceled }. Contains(webException.Status   -  person vendettamit    schedule 25.09.2015


Ответы (1)


Внутри вашей реализации службы WCF внутри ваших контрактов операции перехватывают исключения, которые происходят во время выполнения кода, и возвращают конкретное исключение FaultException, чтобы сообщить вашему клиенту, что ваш код на стороне службы запущен. Можно указать специальный код ошибки или начать сообщение об исключении ошибки с предопределенной подстроки. На вашей стороне клиента, как только вы поймаете исключение Fault, проверьте, существует ли подстрока (или конкретный код ошибки, который вы установили в своем коде службы), если они существуют, это означает, что ваш код на стороне службы запущен, и вам не нужно повторять попытку в противном случае вы можете повторить попытку. Вы также можете поймать другие типы исключений и повторить попытку.

person Dogu Arslan    schedule 28.03.2017