wcf - ChannelFactory.Close VS IClientChannel.Close
(3)
Como usted sabe, ChannelFactory crea el canal del cliente en función de la configuración. Es posible que desee crear múltiples canales de clientes desde una fábrica existente (al mismo punto final que está bloqueado). Si ha terminado de usar la fábrica para crear canales, no hay razón para no cerrarlo.
Pero, ¿por qué querrías mantenerlo abierto? Aquí hay un artículo interesante sobre los clientes de WCF que dice:
Comprobar el valor de la propiedad System.ServiceModel.ICommunicationObject.State es una condición de carrera y no se recomienda para determinar si se debe reutilizar o cerrar un canal.
En lugar de reutilizar un canal, es posible que desee simplemente crear uno nuevo con la fábrica de canales. Más sobre la arquitectura del cliente está aquí .
Considere el siguiente código que es típico de muchos ejemplos de ChannelFactory:
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();
Tenga en cuenta que cuando se llama a proxy.Open (), tanto el estado del canal como el estado de ChannelFactory se convierten en "Abierto". Cuando se invoca proxy.Close (), el estado del canal se "cierra", pero el estado de ChannelFactory permanece "Abierto".
¿Debería uno también cerrar ChannelFactory? No parece ver esto en muchos ejemplos. Además, si es posible, explique la diferencia entre tener un canal abierto o abrir una fábrica de canales.
Además, conozco el problema de IDisposable , por lo que probablemente se puede ignorar por el bien de esta pregunta a menos que tenga un impacto directo en la respuesta.
La respuesta principal me pareció inexacta, así que estoy respondiendo aquí.
Obviamente, Microsoft ha creado un lío absoluto con Channles, Fábricas y Clientes. La documentación tampoco es útil, ya que parecen estar ahí solo para tapar el desorden, así que tuve que recurrir a las pruebas.
Con los problemas de rendimiento con respecto a los canales no almacenados en caché, la implementación cambió en v3.5 para solucionarlos y agregó el almacenamiento en caché, pero eso solo complicaba el problema.
El punto es que el canal en ChannelFactory
no es diferente del canal utilizado por IClientChannel
cuando se crea un canal usando ChannelFactory.CreateChannel()
. Es todo el mismo bote. Créanme no? Tratar:
ChannelFactory<IService> factory = new ChannelFactory<IService>();
// ...
IService service = factory.CreateChannel();
factory.Close();
service.DoIt() // Throws object disposed exception
Entonces, realmente, internamente, es todo el mismo canal. Personalmente, he comenzado a deshacerme de las fábricas de canales y no de los canales de clientes y no he encontrado ningún problema. También he intentado hacer esto en un ciclo con la creación de 100000 canales de cliente, y solo cerrando ChannelFactory
.
Otra opción es utilizar el método estático CreateChannel: msdn.microsoft.com/en-us/library/aa344556.aspx