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
¿Qué hay de cerrar el canal? – Burt
Gracias, esto ha aclarado un poco las cosas, realmente necesito comprar un libro de WCF (cualquier recomendación sería bienvenida). – Burt
¿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