WCF Fiasco
START_RANT
Даже команда Microsoft и WCF знает, что способ ChannelFactory
, Channel
и ClientBase
был спроектирован, и способ его изменения из-за различных проблем с производительностью был настоящим фиаско. Достаточно того факта, что использование прокси является настоящим беспорядком, достаточно знать под расширяемостью WCF, мы имеем дело с неэффективным, раздутым и запутанным дизайном. Просто плохо, плохо, плохо.
END_RANT
Хорошо, вы, вероятно, просматривали документацию, но я предполагаю, что вы не смогли найти свои ответы - как я не смог - так как нет простого ответа. Но вот мои выводы, которые, мы надеемся, суммируют эти моменты (вы не найдете ниже ни в одной документации MS):
1) У нас есть ChannelFactory
и IChannel
. ChannelFactory
знает, как связаться с транспортом, а канал знает, как интерпретировать параметры для вызовов методов WCF и наоборот. IChannel
- это тот, который "реализует" (или выглядит как реализующий) интерфейс службы, в то время как ChannelFactory имеет все необходимые абстракции для связи (включая конечную точку, безопасность, ...).
2) ClientBase
- это не что иное, как ChannelFactory
и IChannel
, слитые вместе. Таким образом, очевидно, что создание ChannelFactory один раз, а затем создание каналов снова и снова означает, что он более эффективен, однако, как вы уже догадались, это не так просто, потому что ...
3) ChannelFactory
после открытия не может быть изменено. Это означает, что если вы используете пароль для имени пользователя для подключения к службе WCF и пароль пользователя меняется, то вам нужен новый. Это может показаться не большой проблемой, но становится большой проблемой в сценарии ASP NET.
4) ChannelFactory
и IChannel
фактически используют одни и те же базовые каналы связи, поэтому закрытие ChannelFactory сделает IChannel недействительным. Это приводит к путанице в коде очистки и принятии решения, чья ответственность заключается в том, чтобы закрыть соединение.
5) Как видите, нет простого ответа. Если вам не нужно использовать имя пользователя / пароль или изменять конфигурацию во время выполнения, создайте и кэшируйте ChannelFactory, а затем просто создайте каналы. В любом случае ChannelFactory
и IChannel
более эффективны, чем ClientBase
.