2015-09-25 7 views
0

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

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

Так я хочу повторить, только если

  1. Я послал запрос
  2. перехвачено исключение
  3. Ни из кода на стороне сервера в моем методе OperationContract не казнили

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

+1

Я не уверен, что вы когда-либо знаете клиентскую сторону, если ** не было ** кода сервера. Если пакет отправился на сервер, но клиент не получил ответа, нет абсолютно никакого способа узнать, что происходит на стороне сервера. Таким образом, в случае любого исключения повторение имеет смысл, просто убедитесь, что вы правильно обрабатываете ответы, например, включив уникальные идентификаторы с сообщениями и сравнивая входящий идентификатор с списком ранее сохраненных идентификаторов. –

+0

Я думаю, что статья, о которой вы упомянули, охватывает обработку исключения Transient. Вы взглянули на определение метода IsTransient (Exception ex). 'WebExceptionStatus.ConnectionClosed, WebExceptionStatus.Timeout, WebExceptionStatus.RequestCanceled}. Содержит (webException.Status' – vendettamit

ответ

0

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

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

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