2011-01-10 23 views
11

Tengo un servicio web WCF que actúa como proveedor de datos para mi página web ASP.NET.Reutilización de clientes del servicio WCF

A lo largo de la página web, se realizan varias llamadas al servicio web a través de ServiceClient autogenerado.

Actualmente creo un nuevo ServiceClient y lo abro para cada solicitud, es decir, obtener usuarios, obtener funciones, obtener una lista de clientes, etc. ... Cada uno de estos crearía un nuevo ServiceClient y abriría una nueva conexión.

¿Puedo hacer que mi clase ServiceClient sea una clase global o estáticamente disponible para que todas las funciones dentro de mi página web ASP.NET puedan usar el mismo cliente? Esto parece ser mucho más eficiente. ¿Hay algún problema con hacerlo de esta manera? ¿Algún consejo que debería tener en cuenta al hacer esto?

¿Qué ocurre si realizo varias solicitudes a un cliente? Es de suponer que todo es sincrónico, por lo que no debería importar si hago 1 o 50 llamadas a él?

Gracias

Respuesta

7

Cuando se utiliza la sesión (wsHttp con contexto de seguridad o sesión confiable) o conexión (net.tcp, net.pipe), se debe usar el enlace orientado su proxy en la forma en que desea manejar la sesión. Por lo tanto, si comparte el proxy, todas las llamadas se manejarán en una única sesión de WCF (por defecto manejada por una sola instancia de servicio). Pero tiene que lidiar con una complejidad adicional como: la excepción de servicio no administrado terminará su canal y la siguiente llamada del cliente dará lugar a una excepción.

Cuando se utiliza el enlace HTTP sin sesión (basicHttp, webHttp) puede compartir su proxy o incluso hacerlo estático. Cada llamada se maneja por separado, la excepción en un servicio no generará fallas en el canal y de manera transparente reuses opened HTTP persistent connections. Pero debido a esto, no debería haber grandes gastos generales para crear un nuevo proxy/canal.

Así que mi sugerencia es: Cuando necesite varias llamadas a su servicio en el procesamiento de solicitud única en su aplicación ASP.NET, use el mismo proxy/canal. Pero no comparta proxy/canal entre diferentes solicitudes.

1

Creo que el uso de un ChannelFactory podría tomar de su problema. Si estoy en lo cierto, el ChannelFactory tiene un grupo de conexiones y vuelve a utilizar los canales. La ventaja de esto es que los canales no se instalan cada vez, solo el primero.

leer más aquí: ChannelFactory

para manejar el disponer de los canales que necesita algún tratamiento especial ya que el canal puede lanzar una excepción en disponer. Escribí un mapeador para manejar esto, puede leer al respecto aquí: http://blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/

+0

¿Esto no crearía simplemente una nueva conexión para cada solicitud, en lugar de realizar todas mis solicitudes a través de una conexión? – Chris

+0

No creo que cree una conexión para cada solicitud, simplemente la abre (cuando llamas abierta) ... pero no estoy 100% seguro. Creo que crear la conexión es la parte que cuesta mucho. Esto podría verificarse fácilmente, implementar un cliente simple como este y hacer dos llamadas idénticas donde está cronometrando las llamadas. Si estoy en lo cierto, la segunda llamada debería ser mucho más rápida. –

+0

Y normalmente ** no ** quiere mantener la conexión abierta para siempre, el flujo normal es la conexión abierta, llame y luego cierre. –

Cuestiones relacionadas