2010-03-14 17 views
8

Tengo una aplicación WPF que utiliza servicios WCF para realizar llamadas al servidor.WCF Service Client Lifetime

que utilizar esta propiedad en mi código para acceder al servicio

private static IProjectWcfService ProjectService 
{ 
    get 
    { 
     _projectServiceFactory = new ProjectWcfServiceFactory(); 
     return _projectServiceFactory.Create(); 
    } 
} 

El Crear en la fábrica se parece a esto

public IProjectWcfService Create() 
    { 
     _serviceClient = new ProjectWcfServiceClient(); 

     //ToDo: Need some way of saving username and password 
     _serviceClient.ClientCredentials.UserName.UserName = "MyUsername"; 
     _serviceClient.ClientCredentials.UserName.Password = "MyPassword"; 

     return _serviceClient; 
    } 

Para acceder a los métodos de servicio que utilizo somethingn como la siguiente.

ProjectService.Save(dto); 

¿Es este un buen enfoque para lo que estoy tratando de hacer? Tengo un error que no puedo rastrear que creo que puede estar relacionado con tener demasiadas conexiones de cliente de servicio abiertas (¿es esto posible?) Aviso Nunca cierro el cliente de servicio ni lo reutilizo.

¿Cuál sería la mejor práctica para el cliente del servicio WCF para las llamadas WPF?

Gracias de antemano ...

Respuesta

11

Estás en el camino correcto, diría ;-)

Básicamente, crear el proxy de cliente WCF es un proceso de dos pasos:

  • crear la fábrica de canal
  • de la fábrica de canales, crear el canal real

El paso n. ° 1 es bastante "costoso" en términos de tiempo y esfuerzo, por lo que definitivamente es una buena idea hacerlo una vez y luego almacenar en caché la instancia de ProjectWcfServiceFactory en algún lugar de su código.

El paso n. ° 2 es bastante liviano, y dado que un canal entre un cliente y un servicio puede caer en un "estado fallido" cuando ocurre una excepción en el servidor (y luego debe volverse a crear desde cero), el almacenamiento en caché del canal real per se es menos deseable.

Así que la comúnmente aceptada la mejor práctica sería:

  • crear el ChannelFactory<T> (en su caso: ProjectWcfServiceFactory) una vez y la memoria caché durante el mayor tiempo posible; Haga ese trabajo pesado solo una vez

  • Cree el Channel actual (aquí: IProjectWcfService) según sea necesario, antes de cada llamada. De esta manera, usted no tiene que preocuparse de comprobar su estado y volver a crearlo como sea necesario

ACTUALIZACIÓN: "? ¿Qué pasa con el cierre del canal" pregunta Burt ;-) ¡Buen punto!

La mejor práctica aceptada para esto es envolver su llamada de servicio en un bloque try....catch....finally. La parte difícil es: al deshacerse del canal, las cosas también pueden salir mal, por lo que podría obtener una excepción; por eso no es suficiente envolverlo en un bloque using(....).

Así que básicamente tienen:

IProjectWcfService client = ChannelFactory.CreateChannel(); 
try 
{ 
    client.MakeYourCall(); 
} 
catch(CommunicationException ce) 
{ 
    // do any exception handling of your own 
} 
finally 
{ 
    ICommunicationObject comObj = ((ICommunicationObject)client); 

    if(comObj.State == CommunicationState.Faulted) 
    { 
     comObj.Abort(); 
    } 
    else 
    { 
     comObj.Close(); 
    } 
} 

Y, por supuesto, que definitivamente podría muy bien terminar con esto en un método o un método de extensión o algo con el fin de no tener que escribir esto cada vez que realice un servicio llamada.

ACTUALIZACIÓN:

El libro que siempre recomiendo a ponerse en marcha en WCF rápidamente es Learning WCF por Michele Leroux Bustamante. Ella cubre todos los temas necesarios, y de una manera muy comprensible y accesible. Esto le enseñará todo: aspectos básicos, temas intermedios, seguridad, control de transacciones, etc., que necesita saber para escribir servicios WCF de alta calidad.

Learning WCF http://ecx.images-amazon.com/images/I/41wYa%2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

Los temas más avanzados y más profundo vistazo a WCF será cubierto por Programming WCF Services por Juval Lowy. Realmente se sumerge en todos los detalles técnicos y temas y presenta "la Biblia" para la programación de WCF.

Programming WCF Services http://ecx.images-amazon.com/images/I/41H2u13a9bL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

+0

¿Qué hay de cerrar el canal? – Burt

+0

Gracias, esto ha aclarado un poco las cosas, realmente necesito comprar un libro de WCF (cualquier recomendación sería bienvenida). – Burt

+0

¿Por qué es la captura y, finalmente, esencialmente haciendo las mismas cosas, es decir, comObj.Abort? ¿Hay alguna necesidad de abortar en la captura? – Burt