WCF ChannelFactory Государственная собственность - PullRequest
10 голосов
/ 06 января 2010

Что значит для ChannelFactory иметь свойство State? Я понимаю, что созданный канал может иметь состояния соединения. Но я не совсем понимаю, почему ChannelFactory также имеет такие состояния соединения. Он тоже подключается к службе WCF?

Ответы [ 2 ]

9 голосов
/ 14 марта 2012

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

Настоящий вопрос сводится к двум частям

  1. Почему происходит от ChannelFactory от CommunicationObject
  2. Что означает на самом деле State?

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

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

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

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

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

0 голосов
/ 17 января 2012

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

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

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

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

...