WCF - фабрика каналов против клиентской базы - PullRequest
22 голосов
/ 16 октября 2011

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

Затем я использовал ChannelFactory для создания канала и выполнения операций, так как клиент и сервер могут совместно использовать контракты (один и тот же проект).Но IClientChannel обеспечивает только BeginOpen/EndOpen/BeignClose/EndClose.Он не имеет ClientBase BeginOperation/EndOperation методов.Поэтому в основном я не могу выполнить операцию на канале асинхронно, чтобы освободить ее, чтобы я мог использовать канал для выполнения других операций.

Я просто создал каналы для каждой операции, и это решило проблему

Итак, мой вопрос:

  1. Что лучше (ClientBase vs. ChannelFactory) по сравнению с моим сценарием, особенно я хочу выполнить несколько операций над объектом службы одновременно с несколькими потоками

  2. Желательно ли создать канал для каждой операции?

  3. На самом деле я думал, что у нас может быть только один канал между двумя конечными точками (клиент / сервис).Но я могу создать столько каналов, сколько захочу.Например: я смог создать Int16.MaxValue каналов.Так что не уверен, какой лимит и рекомендации на это.

    Service[] channels = new IService[Int16.MaxValue];
    
    for(int i = 0; i<Int16.MaxValue; i++)
    {
       channels[i] = factory.CreateChannel();
    }
    

Так что, в принципе, не могли бы вы дать мне знать об основах каналов, рекомендациях, хитростях и т. Д ... и т. Д.:)

1 Ответ

27 голосов
/ 16 октября 2011

Существует разница, использующая асинхронность между ClientBase и ChannelFactory<T>. В основном ClientBase использует асинхронную модель, управляемую событиями.

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

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

Для получения дополнительной информации об асинхронности для ClientBase и ChannelFactory<T> см .:

Как: асинхронно вызывать операции службы WCF

Как: асинхронно вызывать операции с использованием фабрики каналов

...