WCF ChannelFactory Государственная собственность
Что значит для ChannelFactory иметь свойство State? Я понимаю, что созданный канал может иметь состояния соединения. Но я не совсем понимаю, почему ChannelFactory также имеет такие состояния соединения. Это тоже подключается к службе WCF?
2 ответа
ChannelFactory
объект имеет State
потому что это CommunicationObject
, и все CommunicationObjects
в WCF есть State
, Конечно, это только напрашивается вопрос, и не очень полезно.
Настоящий вопрос сводится к двум частям
- Почему
ChannelFactory
вытекают изCommunicationObject
- Что делает его
State
на самом деле значит?
На второй вопрос легче ответить, поэтому начнем с него. State
ChannelFactory определяет, может ли он использоваться для создания новых клиентских каналов, и могут ли эти клиентские каналы все еще использоваться.
Как и у всех CommunicationObjects
в WCF State
определяет, какие операции вам разрешено делать с объектом. Канальная фабрика действительно имеет только одну операцию: CreateChannel
, Если фабрика Open
вы можете создавать каналы; если это Closed
или же Faulted
, ты не можешь. Конкретный (внутренний) канал заводской реализации (скажем, и HttpChannelFactory
) очистить любые внутренние ресурсы, когда они Close()
"Д; это включает освобождение ресурсов, созданных в целях безопасности, освобождение дескрипторов для именованных каналов и т. д.
Кроме того, когда вы Close()
фабрика каналов, она перебирает все каналы и звонки Close()
на каждом из них, прежде чем перейти в Closed
заявить само. (По-видимому, существует некоторый общий код утилит (создание HTTP-запросов и т. Д.), Которые фабрики каналов реализуют от имени своих каналов, так что каналы больше не могут функционировать после закрытия фабрики каналов. Именно поэтому каналы вынужден закрыть одновременно.)
Чтобы узнать все подробности, скачайте справочный источник WCF, но будьте готовы потерять день или около того:)
Более важный вопрос, почему ChannelFactory
это CommunicationObject
совсем? Здесь я прибегаю к догадкам, потому что, насколько я вижу, сами фабричные объекты никогда не взаимодействуют с удаленной системой. Тем не менее, они выполняют большую настройку и проверку параметров своих привязок перед созданием канала, что требует выделения тех же видов ресурсов, что и фактическое сетевое соединение. Например, фабрика каналов именованных каналов создает и управляет пулом соединений для своих каналов; фабрики каналов HTTP и HTTPS проверяют идентификационную информацию и значения аутентификации. Я предполагаю, что фабрики каналов выполняют эту настройку один раз, поэтому каналы могут ее пропустить; CommunicationObject
шаблон просто предоставил удобный способ управления временем жизни фабрики каналов, поскольку все остальное в WCF управляется таким образом.
Я думаю, что это интересно, я не знаю ответа, но рискну предположить, что ChannelFactory может сохранить ресурсы доступными в случае, если другие экземпляры канала будут использовать тот же ресурс (либо одновременно, либо в ближайшем будущем).
Например, если вы используете фабрику каналов со стеком каналов, который использует TcpChannel в качестве транспортного канала, соединение TCP может управляться ChannelFactory, поскольку несколько каналов потенциально могут повторно использовать одно и то же соединение TCP, что экономит накладные расходы на производительность. разорвать / заново инициировать соединение.
Поэтому, когда вы закрываете свой канал, канал уведомляет фабрику каналов о том, что ресурс больше не нужен, и тогда фабрика каналов может освободить ресурс по мере необходимости (т.е. после истечения времени ожидания?).
Я могу проверить это, если это так, если никто больше не дает хорошего ответа.