2013-09-17 3 views
1

Я хочу, чтобы добавить поведение повторов на стороне сервера, если что-то конкретное происходит во время работы.Как реализовать WCF на стороне сервера повторит

Пользовательские IOperationInvoker выглядит хорошим кандидатом для этой функции, но ...

К сожалению экземпляр, на котором операция должна быть выполнена уже создан/решена, поэтому, чтобы правильно реализовать логику повторных попыток, каждый должен написать реализацию лиц без обслуживания, которые довольно лимитирует, иногда приятно иметь режим InstanceContextMode.PerCall и состояние, которое живет только во время жизни запроса.

Есть ли место или возможность заставить WCF заново создать/услугу решительности и вызвать операцию еще раз?

+0

Не могли бы вы более подробно описать, почему вам нужно логику повторных попыток, и почему вы решили реализовать его на стороне сервера? –

+0

Я не вижу логики «К сожалению, экземпляр, в котором должна выполняться операция, уже создан/разрешен, поэтому для правильной реализации логики повторения каждый должен писать службу без состояния».Почему вы не можете повторить попытку с использованием одного экземпляра службы? Не удалось ли его внутреннее состояние мутировать? Если да, то как? Необходимо более подробный пример. – ErnieL

+0

@ ErnieL, о котором я упоминал в своем вопросе, требуя, чтобы реализация была безгражданна или, что еще труднее, безопасна для исключительных ситуаций, весьма ограничена. В моем случае реализация сервиса разрешена из контейнера IoC с зависимостями, использующими ORM, состояние которых повреждено после исключения и не может быть повторно использовано. –

ответ

0

Не так легко imlement логику повторных попыток самостоятельно. Вам придется иметь дело с рядом вопросов:

  1. Что делать, если все попытки не удались?
  2. Должен ли быть интервал между попытками?
  3. Что делать, если сервер находится между первой и второй попытками?
  4. т.д.

К счастью, есть из раствора коробки, который уже делает все для вас. Взгляните на привязку WCF MSMQ.

  1. Он поместит объект контракта в очередь на мертвую букву, если вы пожелаете, чтобы вы могли легко отслеживать такие сообщения и даже принудительно обрабатывать их снова.
  2. Вы можете установить интервал между попытками. Поэтому, если сервер не работает в течение 10 минут, не все попытки будут сняты.
  3. Вы можете настроить его на долговечность. Он будет хранить сообщения на диске, поэтому, когда ваш сервер вернется, он попытается обработать сообщение еще раз.
  4. т.д. Посмотрите на MSMQ связывающую вы найдете много полезных функций. Вот хорошая статья о queuing in WCF

Таким образом, в конечном счете ваш дизайн будет что-то вроде этого:

Client Call -> MSMQ -> Службы

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

Только в случае, если вы не можете использовать MSMQ привязки непосредственно с вами клиентом, вы всегда можете пойти с особой стороне сервера сервиса, который просто помещает сообщения в очередь. Таким образом, конструкция будет: обслуживание

Client -> HTTP -> QueueService (один метод, который помещает сообщения в очередь) -> MSMQ -> ProcessService

Надеется, что это помогает!

+0

Ты меня не понимал, или я не мог себя выразить. Я знаю вещи, которые следует принимать во внимание при выполнении повторных попыток. Мой вопрос был чистым техническим - с учетом одной из привязок RPC WCF (Http/Tcp/whatever), что лучше всего вводить в инфраструктуру на стороне сервера WCF, чтобы иметь возможность повторять вызов в новом экземпляре, если контекстный режим экземпляра PerCall , Надеюсь, на этот раз это понятно. –

+0

Ну, вам нужна логика повтора, когда экземпляр вашего сервиса воссоздается с каждой попыткой, правильно? Таким образом, вы просто настраиваете свой режим экземпляра как PerCall, а затем при каждой попытке обработать сообщение из MSMQ он создаст новый экземпляр службы –

+0

@MaksymStukov, поскольку я сказал, что изменить привязку невозможно, это должен быть RPC. Скажем, потому что это запрос запроса из веб-интерфейса. Мы используем очереди и сообщения для команд, но мы не используем очереди для запросов, когда время ожидания и время отклика жизненно важны, не так ли? –

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