A ChannelFactory
объект имеет State
, потому что это CommunicationObject
, а все CommunicationObjects
в WCF имеют State
. Конечно, это только вопрос, и не очень полезно.
Настоящий вопрос сводится к двум частям
- Почему происходит от
ChannelFactory
от CommunicationObject
- Что означает на самом деле
State
?
На второй вопрос легче ответить, поэтому давайте начнем с него. State
ChannelFactory определяет, может ли он использоваться для создания новых клиентских каналов, и , могут ли эти клиентские каналы все еще использоваться.
Как и все CommunicationObjects
в WCF, State
определяет, какие операции вам разрешено делать с объектом. У фабрики каналов действительно только одна операция: CreateChannel
. Если фабрика Open
, вы можете создавать каналы; если это Closed
или Faulted
, вы не можете. Реализации фабрики бетонных (внутренних) каналов (скажем, и HttpChannelFactory
) очищают любые внутренние ресурсы, когда они Close()
'd; это включает в себя освобождение ресурсов, созданных в целях безопасности, освобождение дескрипторов для именованных каналов и т. д.
Кроме того, когда вы Close()
фабрика каналов, она проходит по всем каналам и вызывает Close()
на каждом из них, прежде чем перейти в само состояние Closed
. (Похоже, существует некоторый общий код утилит (создание HTTP-запросов и т. Д.), Которые фабрики каналов реализуют от имени своих каналов, так что каналы больше не могут функционировать после закрытия фабрики каналов. Именно поэтому каналы принудительное закрытие одновременно.)
Чтобы узнать все подробности, скачайте Справочный источник WCF , но будьте готовы потерять день или около того:)
Значит, еще больший вопрос: почему ChannelFactory
это CommunicationObject
вообще? Здесь я прибегаю к догадкам, поскольку, насколько я вижу, сами фабричные объекты никогда не на самом деле сообщаются с удаленной системой. Тем не менее, они выполняют большую настройку и проверку параметров своей привязки перед созданием канала, что требует выделения тех же видов ресурсов, что и фактическое сетевое соединение. Например, фабрика каналов именованных каналов создает и управляет пулом соединений для своих каналов; фабрики каналов HTTP и HTTPS проверяют идентификационную информацию и значения аутентификации. Моя догадка заключается в том, что фабрики каналов выполняют эту настройку один раз, поэтому каналы могут ее пропустить; шаблон CommunicationObject
просто предоставил удобный способ управления временем жизни фабрики каналов, поскольку все остальное в WCF управляется таким образом.