2009-05-14 2 views
28

Рассмотрим следующий код, который typcial многих ChannelFactory примеров:ChannelFactory.Close VS IClientChannel.Close

WSHttpBinding myBinding = new WSHttpBinding(); 
EndpointAddress myEndpoint = new EndpointAddress(
    ConfigurationSettings.AppSettings["HelloWorldServiceURL"]); 

ChannelFactory<IHelloWorldService> myChannelFactory = 
    new ChannelFactory<IHelloWorldService>(myBinding, myEndpoint); 

IHelloWorldService proxy = myChannelFactory.CreateChannel(); 
((IClientChannel)proxy).Open(); 
HelloWorldDataContract dc = proxy.SayHello(); 
((IClientChannel)proxy).Close(); 

Обратите внимание, что при proxy.Open() вызывается, как состояние телеканала и состояние в ChannelFactory становятся «Открытый». Когда вызывается proxy.Close(), состояние канала становится «закрытым», но состояние ChannelFactory остается «Opened».

Следует ли закрывать ChannelFactory? Кажется, я не вижу этого во многих примерах. Кроме того, если возможно, объясните разницу между открытием канала и открытием канала.

Кроме того, я знаю о IDisposable issue, поэтому его, вероятно, можно игнорировать ради этого вопроса, если он не оказывает прямого воздействия на ответ.

ответ

12

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

Но почему вы хотите оставить его открытым? Вот интересный article on WCF clients, который говорит:

Проверка значения собственности System.ServiceModel.ICommunicationObject.State этого состояние гонки и не рекомендуются, чтобы определить, является ли повторного использования или закрыть канал.

Вместо повторного использования канала вы можете просто создать новый с фабрикой каналов. More on the client architecture is here.

+1

Я нашел ваш ответ неточным, когда вы говорите 'Если вы сделали, используя фабрику для создания каналов, нет никаких причин, чтобы не закрывать Оно деталь A.'. Это не удастся, если вы это сделаете - см. Мой ответ. – Aliostad

19

Я нашел основной ответ неточным, поэтому я отвечаю здесь.

Очевидно, что Microsoft сделала абсолютный беспорядок из стран и заводов и клиентов. Документация также не очень полезна, поскольку они, похоже, там, чтобы скрыть беспорядок, поэтому мне пришлось прибегнуть к тестированию.

С проблемами производительности, связанными с не кэшированными каналами, реализация была изменена в v3.5 для решения этих проблем и добавления кэширования, но это только осложнило проблему.

Точка канала в ChannelFactory фактически не отличается от канала, используемого IClientChannel, когда вы создаете канал, используя ChannelFactory.CreateChannel(). Это все тот же горшок. Не верьте мне? Попытайтесь:

ChannelFactory<IService> factory = new ChannelFactory<IService>(); 
// ... 
IService service = factory.CreateChannel(); 
factory.Close(); 
service.DoIt() // Throws object disposed exception 

Итак, на самом деле, это все тот же канал. Я лично начал распоряжаться каналами, а не клиентскими каналами, и не сталкивался с какой-либо проблемой. Я также попытался сделать это в цикле с созданием 100000 клиентских каналов и только закрытием ChannelFactory.

+0

Но можете ли вы повторно использовать завод после его закрытия? Я думал, что был достигнут успех в создании фабрики для каждого канала. –

+0

Почему я спрашиваю, потому что я написал эту общую оболочку: http://blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/ –

+1

Завод закрытых каналов не может быть повторно использован. Создание новой фабрики каналов влияет на производительность, но если вам нравится, что я должен использовать аутентификацию, как только вы ее открыли, вы не сможете изменить имя пользователя/пароль, поэтому вам нужно создавать его каждый раз. – Aliostad

Смежные вопросы