2009-05-14 8 views
28

considere el siguiente código pasa lo que es de los muchos ejemplos 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(); 

Tenga en cuenta que cuando se llama proxy.Open(), tanto el estado del canal y el estado del ChannelFactory convertirse "Abrió". Cuando se invoca proxy.Close(), el estado del canal se "cierra", pero el estado de ChannelFactory permanece "Abierto".

¿Debería estar uno cerrando ChannelFactory también? 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, soy consciente del IDisposable issue, por lo que probablemente se puede ignorar por el bien de esta pregunta a menos que tenga un impacto directo en la respuesta.

Respuesta

12

Como ya sabe, ChannelFactory crea el canal del cliente según 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é quieres mantenerlo abierto? Aquí hay una interesante article on WCF clients que dice:

Comprobación del valor de la propiedad System.ServiceModel.ICommunicationObject.State es una condición de carrera y es no se recomienda para determinar si para su reutilización o cerrar un canal.

En lugar de reutilizar un canal, es posible que desee simplemente crear uno nuevo con la fábrica de canales. More on the client architecture is here.

+1

encontré su respuesta inexacta cuando dice 'Si ya está utilizando la fábrica para crear canales, no hay ninguna razón para no cerrar it'. Fallará si lo hace - vea mi respuesta. – Aliostad

19

Encontré la respuesta principal incorrecta así que estoy respondiendo aquí.

Obviamente, Microsoft ha creado lío absoluto de Channles and Factories and Clients. 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 solucionar estos problemas y agregó el almacenamiento en caché, pero eso solo complicaba el problema.

El punto es el canal en ChannelFactory, de hecho no es diferente del canal utilizado por IClientChannel cuando se crea un canal usando ChannelFactory.CreateChannel(). Es todo el mismo bote. Créanme no? Pruebe:

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

De hecho, 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 clientes, y solo cerrando ChannelFactory.

+0

¿Pero puede reutilizar la fábrica después de cerrarla? Pensé que había un golpe de rendimiento en la creación de la fábrica para cada canal. –

+0

Por qué lo pregunto es porque escribí este contenedor genérico: http://blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/ –

+1

La fábrica de canal cerrado no se puede reutilizar. La creación de una nueva fábrica de canales afecta el rendimiento, pero si me gusta debe usar la autenticación, una vez que la abrió, no puede cambiar el nombre de usuario/contraseña, por lo que debe crearla cada vez. – Aliostad

Cuestiones relacionadas