Инициализация клиентского прокси WCF

Я использую службу WCF и создал ее прокси, используя ссылку на службу VS 2008.

Я ищу лучший шаблон для вызова метода службы WCF

  • Должен ли я создавать экземпляр прокси-сервера клиента каждый раз, когда я вызываю метод службы, и закрывать клиента, как только я закончу с этим? Когда я профилировал свое клиентское приложение, я увидел, что получение канала занимает много времени при инициализации прокси-клиента.
  • Должен ли я использовать шаблон Singleton для клиентского прокси, чтобы я мог использовать только один экземпляр и избавиться от накладных расходов на повторную инициализацию? Есть ли какие-то скрытые проблемы с этим подходом?

Я использую .Net framework 3.5 SP1, basicHttp привязку с небольшой настройкой.


person 123Developer    schedule 05.11.2009    source источник
comment
@ 123Developer: отлично - спасибо! (для новичков это не так просто очевидно - согласен - поэтому и указываю на это)   -  person marc_s    schedule 05.11.2009


Ответы (2)


По-разному ;-)

Если в вашем приложении есть последовательность, которая требует нескольких вызовов один за другим, вы можете повесить прокси-клиент и продолжать использовать его для дальнейших вызовов. Однако будьте осторожны, чтобы проверить состояние «сбой» - если на сервере произойдет ошибка, канал между прокси-сервером клиента и сервером может «выйти из строя», и, таким образом, прокси-сервер вашего клиента станет непригодным для использования.

Кроме того - дорогостоящая часть - это создание ChannelFactory<T> - вы можете попытаться разделить эти два шага при создании клиентского прокси в коде:

ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>();

Держитесь за эту фабрику каналов, например кэшировать это где-нибудь

Второй шаг должен быть менее интенсивным по времени и мощности:

IYourService client = factory.CreateChannel();

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

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

Марк

person marc_s    schedule 05.11.2009
comment
Я согласен с подходом к созданию единственного экземпляра фабрики и отсутствию экземпляров одиночного канала. Для каналов используйте em и свободные em и обязательно закройте их должным образом, проверив состояние ошибки. - person CodingWithSpike; 05.11.2009

Извините, что поднял старый вопрос, но я хотел добавить его для удобства.

Полностью согласен с marc_s и rally25rs. Так что начните с этого, но также подумайте об использовании прокси или оболочки, которая обрабатывает неисправные состояния. Вот вопрос по SO, в котором обсуждаются некоторые решения. , и вот еще одно хорошее решение, которое я нашел в Интернете от Корнелиу. , «Создание многоразового прокси-сервера ClientBase». Его решение генерирует оболочки, которые предоставляют ваши методы обслуживания для максимального удобства и производительности. Мне все еще нужно проверить, работает ли это :).

person Andre Luus    schedule 18.06.2010