Инициализация прокси-сервера клиента WCF
Вопрос
Я использую службу WCF и создал ее прокси, используя ссылку на службу VS 2008.
Я ищу наилучший шаблон для вызова сервисного метода WCF
- Должен ли я создавать экземпляр прокси-сервера клиента каждый раз, когда я вызываю метод service, и закрывать клиент, как только я закончу с этим?Когда я профилировал свое клиентское приложение, я мог видеть, что получение канала при инициализации прокси-клиента занимает много времени
- Должен ли я использовать одноэлементный шаблон для клиентского прокси-сервера, чтобы я мог использовать экземпляр only once и избавиться от накладных расходов на повторную инициализацию?Есть ли какая-то скрытая проблема с таким подходом?
Я использую .Net framework 3.5 SP1, привязка к basicHttp с небольшими настройками.
Решение
Это зависит ;-)
Если у вас есть последовательность в вашем приложении, которая требует нескольких вызовов друг за другом, вы могли бы подключиться к прокси-клиенту и продолжать использовать его для совершения дальнейших вызовов.Однако имейте в виду, что необходимо проверить состояние "сбой" - если на сервере произойдет ошибка, канал между клиентским прокси-сервером и сервером может "выйти из строя", и, таким образом, ваш клиентский прокси станет непригодным для использования.
Кроме того, дорогостоящей частью является создание ChannelFactory<T>
- вы могли бы попробовать разделить эти два шага при создании вашего клиентского проекта в коде:
ChannelFactory<IYourService> factory = new ChannelFactory<IYourService>();
Держитесь за эту фабрику каналов, напримерспрячь его где - нибудь
Второй этап должен быть гораздо менее интенсивным с точки зрения времени и лошадиных сил:
IYourService client = factory.CreateChannel();
Вы могли бы выполнять этот шаг перед каждым вызовом (или последовательностью вызовов) и, на самом деле, не должны получать от этого плохой производительности.
Я бы настоятельно рекомендовал избегать одиночных игр, когда это возможно - это все равно что открывать банку с червями, не делайте этого, если вам абсолютно не нужно (напримердля управления доступом к одному ресурсу, который одновременно доступен только для одного вызывающего абонента).
Марк
Другие советы
Извините, что поднял старый вопрос, но я хотел добавить это для удобства использования.
Я полностью согласен с marc_s и rally25rs.Так что начните с этого, но также рассмотрите возможность использования прокси-сервера или оболочки, которая обрабатывает сбойные состояния. Вот такой вопрос на SO, в котором обсуждаются некоторые решения, и вот еще один хорошее решение, на которое я наткнулся в Интернете от Корнелиу, "Создание повторно используемого прокси-сервера клиентской базы".Его решение генерирует оболочки, которые предоставляют ваши методы обслуживания для максимального удобства и производительности.Хотя мне все еще нужно проверить, работает ли это :).