WCF ChannelFactory State Property

Что значит для ChannelFactory иметь государственную собственность? Я понимаю, что созданный канал может иметь состояния, основанные на соединении. Но я смущен тем, почему ChannelFactory также имеет такие состояния связи. Связано ли это с WCF-сервисом?

Ответ 1

A ChannelFactory объект имеет State, потому что это CommunicationObject, а все CommunicationObjects в WCF имеют State. Конечно, это просто попрошайничать, и не очень полезно.

Реальный вопрос сводится к двум частям

  • Почему выполняет ChannelFactory от CommunicationObject
  • Что означает его State?

На второй легче ответить, поэтому давайте начнем там. State ChannelFactory определяет, может ли он использоваться для создания новых клиентских каналов, и могут ли эти клиентские каналы использоваться.

Как и во всех CommunicationObjects в WCF, State определяет, какие операции вам разрешено делать с объектом. Канал factory действительно имеет только одну операцию: CreateChannel. Если factory - Open, вы можете создавать каналы; если это Closed или Faulted, вы не можете. Реализация конкретных (внутренних) каналов factory (скажем, и HttpChannelFactory) очищает любые внутренние ресурсы, когда они Close() 'd; это включает освобождение ресурсов, созданных для целей безопасности, освобождение дескрипторов для именованных каналов и т.д.

Кроме того, когда вы Close() канал factory, он перебирает все каналы и вызывает Close() для каждого из них, прежде чем перейти в состояние Closed. (Кажется, есть общий код утилиты (создание HTTP-запросов и т.д.), Которые фабрики каналов реализуют от имени своих каналов, так что каналы перестали функционировать, как только канал factory был отключен. каналы принудительно закрываются одновременно.)

Для всех деталей gory, загрузите Справочный источник WCF, но будьте готовы потерять день или около того:)

Чем больше вопрос, почему a ChannelFactory является CommunicationObject вообще? Здесь я прибегаю к угадыванию, потому что, насколько я вижу, объекты factory никогда не обмениваются данными с удаленной системой. Тем не менее, они выполняют большую настройку и проверку своих параметров привязки до создания канала, что требует выделения тех же ресурсов, что и фактическое сетевое подключение. Канал именованных каналов factory, например, создает и управляет пулом соединений для своих каналов; фабрики каналов HTTP и HTTPS проверяют идентификационные данные и значения аутентификации. Я предполагаю, что заводы канала выполняют эту настройку один раз, поэтому каналы могут пропустить ее; шаблон CommunicationObject просто предоставил удобный способ управления временем жизни канала factory, так как все остальное в WCF управляется таким образом.

Ответ 2

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

Например, если вы используете канал factory со стеком каналов, который использует TcpChannel в качестве транспортного канала, TCP-соединение может управляться ChannelFactory, поскольку несколько каналов могут потенциально повторно использовать одно и то же соединение TCP, это сохраняет накладные расходы на производительность при разрыве/повторном подключении.

Итак, когда вы закрываете канал, канал уведомляет канал factory о том, что ресурс больше не нужен, тогда канал factory может освободить ресурс как и когда он сочтет нужным (т.е. после таймаута?).

Я могу проверить это, если это так, если никто другой не дает хорошего ответа.