Использование Прямого канала по сравнению с использованием Прокси?

Поскольку заголовок подразумевает, что я пытаюсь получить понимание того, почему в WCF иногда люди принимают решение "генерировать прокси" по сравнению с использованием ChannelFactory для ручного создания новых экземпляров канала. Я видел примеры каждого, но действительно не нашел объяснений того, ПОЧЕМУ Вы пошли бы для одного по сравнению с другим.

Чтобы быть честным, я только когда-либо работал с каналами и ChannelFactory<T> из кода я наследовался, т.е.:

IChannelFactory<IDuplexSessionChannel> channelFactory =
    binding.BuildChannelFactory<IDuplexSessionChannel>();

_duplexSessionChannel = channelFactory.CreateChannel(endpointAddress);

Итак, почему был бы я "генерировать прокси"? Каковы преимущества и недостатки?

9
задан John Saunders 16 March 2012 в 15:09
поделиться

2 ответа

Основное различие заключается в следующем:

  • генерация прокси требует от вас только знания URL, где находится сервис. При генерации прокси все остальное (контракт сервиса и контракты данных) будет определяться путем изучения метаданных сервиса

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

Второй важный момент заключается в следующем:

  • создание сгенерированного прокси, по сути, выполняет два шага, которые вы должны сделать - создать ChannelFactory, и из него создать фактический канал - в одном конструкторе. У вас нет контроля над этими двумя шагами.

  • создание собственного канала выгодно, так как создание ChannelFactory является дорогостоящим шагом - поэтому вы можете где-то кэшировать экземпляр фабрики каналов. Создание и повторное создание фактического канала из фабрики - гораздо менее затратный шаг, который вы можете выполнять чаще

Таким образом, если вы контролируете оба конца коммуникации, сервис и клиент, у вас есть возможность разделить контракты сервиса в отдельной сборке, и таким образом у вас больше возможностей.

С большинством сторонних сервисов у вас просто нет такой возможности.

17
ответ дан 4 December 2019 в 09:12
поделиться

Использование прокси проще и понятнее. Вы можете иметь дело с простыми вещами - классами и методами этих классов - вместо сложных, связанных с сетью вещей, таких как каналы.

OTOH, это не упрощается из-за недостатка конструкции в WCF, который не позволяет использовать такое же простое использование прокси-сервера WCF, которое мы могли бы использовать с прокси-серверами ASMX:

using (var client = new MyServiceClient())
{
}

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

3
ответ дан 4 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: