Как правильно обработать ошибочное соединение WCF? - PullRequest
1 голос
/ 20 марта 2010

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

Поскольку клиент использует много методов контракта во многих местах, я не хочу добавлять try / catch при каждом вызове метода.

У меня есть 2 идеи для решения этой проблемы:

  1. Создайте метод, который принимает делегат и выполняет его внутри try / catch и возвращает Exception в случае известного исключения или null else. Вызывающий должен иметь дело с результатами nun-null.

  2. Прослушивание события Faulted основного объекта CommunicationObject. Но я не понимаю, как справиться с этим событием, за исключением отображения сообщения об ошибке и выключения.

Существуют ли передовые практики для неисправного соединения WCF , которые существуют для времени жизни приложения ?

Ответы [ 2 ]

1 голос
/ 20 марта 2010

Если у вас есть оба конца провода под вашим контролем - и сервер, и клиент являются приложениями .NET - вы можете подумать об этом подходе:

  • поместите все ваши контракты на обслуживание и данные в общую сборку, которую сервер и клиент будут использовать

  • создать ChannelFactory<IYourService> во время запуска и кэшировать его; поскольку он должен иметь доступ к сервисному контракту, это работает, только если вы можете разделить фактический сервисный контракт между сервером и клиентом. Эта операция является дорогостоящей частью построения клиента WCF

    ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>();
    
  • создает фактический канал связи между клиентом и сервером каждый раз, когда вы делаете вызов, на основе ChannelFactory. Это довольно дешево и не требует много времени - и вы можете полностью отказаться от любых мыслей о необходимости обнаружения или устранения неисправных каналов .....

    IYourService client = factory.CreateChannel();
    client.CallYourServiceMethod();
    

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

0 голосов
/ 20 марта 2010

Я написал сообщение в блоге об исключениях в WCF, в котором рассказывается, как с этим справиться: http://jamescbender.com/bendersblog/Default.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...