2012-04-04 2 views
4

Скажите, что я получил WCF-клиент, который взаимодействует с сервисом WCF в IIS7 (TCP), используя channelelfactory. Если связь нарушена (или услуга переработана), то следующий вызов от клиента приведет к исключению.Исключение связи и перезагрузка автоматически?

На этом этапе мне нужно скрыть исключение и вместо этого попытаться выполнить повторное подключение/повторный вход.

Вопрос, если есть какой-либо простой способ сделать это без добавления кода обработки в каждый ServiceAgentMethod на стороне клиента? Можно ли, например, решить проблему с помощью MessageInspector?

В моем случае у меня было несколько классов агентов в клиенте, который запускает методы обслуживания с уникальным IServceInterface, созданным из ChannelFactory. Что-то вроде этого:

MyServiceAgent.GetService().GetMyObjects 

GetService() возвращает IServiceInterface, который создается при входе в систему с помощью ChannelFactory.

ответ

3

Я бы не пробовал, используя message inspector; когда канал неисправен, он вызывает ошибки hard (как вы видели, вы получаете исключение). Он используется, чтобы указать, что канал больше не считается действительным и что вы не должны звонить ему.

Возможно, вы думаете, что можете сделать это на транспортном уровне, но вам нужно будет согласовать слои над ним (чтобы перевести то, что происходит через провод, к которому у вас действительно не должно быть доступа) чтобы определить, есть ли у вас ошибка.

В конечном счете, вы захотите выпустить логику повтора на уровне, на котором вы вызываете прокси-сервер. Имейте абстракцию клиента (интерфейса), который вы перехватываете до/после того, как вы сделаете вызов прокси; если есть исключение, вы можете повторить вызов, создав новый прокси-канал по мере необходимости.

Будьте осторожны, чтобы ограничить количество повторных попыток; если вы этого не сделаете, у вас будет ядовитая таблетка (ваш код будет бесконечно повторяться). В какой-то момент вы получите , чтобы выбросить исключение.

+0

Я не уверены, что вы имеете в виду с интерфейс клиента? Мысль - использовать какой-то метод делегата. Скажем, что метод грабят делегат и возвращает объект. Метод попытается запустить делегат (против службы) и обработать повторное подключение, если это необходимо. Когда выполняется успешный вызов, верните объект и дайте методу агента применить его к правильному типу. Будет ли это работать? – Banshee

0

Вы можете написать общий потребитель, который вы можете использовать для вызовов WCF. В приведенном примере вы можете указать количество повторов попыток, и оно будет обрабатывать срывание и воссоздание клиентов лучше.

Это все равно будет на стороне клиента, а потому, что является общим и сложности скрыты, я думаю, что это делает для элегантного решения:

var consumer = new ServiceClientWrapper<AuthorServiceClient, AuthorService>(); 
author = consumer.Excecute(service => service.AddAuthor(request)); 

https://github.com/mariusvrstr/WcfClientStressTest/blob/master/Spike.Common/ServiceClientWrapper.cs

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