2011-05-31 15 views
10

He estado leyendo muchos artículos de WCF en línea y parece que la mayoría de las personas almacenan en caché los objetos de ChannelFactory pero no los canales en sí. Parece que la mayoría de las personas teme usar el caché de canales porque no quieren manejar las fallas de red que podrían inutilizar el canal en caché. Pero eso podría solucionarse fácilmente atrapando la CommunicationException en el método, recrear el canal y reproducir el método usando Reflection.¿Por qué el almacenamiento en caché de canales WCF es malo?

Luego hay personas que piensan que es malo hacer caché de canales porque todas las comunicaciones pasarán por un solo canal. Ver el siguiente artículo.

http://social.msdn.microsoft.com/Forums/is/wcf/thread/9cbdf92a-a749-40ce-9ebe-3f2622cd78ee

¿Este es necesariamente algo malo? ¿No puedes compartir canales entre hilos? ¿Sufrirá un rendimiento debido a que las llamadas a múltiples métodos realizadas en este canal único serán procesadas en serie?

No he encontrado evidencia de que compartir canales disminuya el rendimiento. Lo que encontré es que usar un canal en caché es aproximadamente 5 veces más rápido que usar un canal no almacenado en caché, incluso si eso significa tener que usar Reflection para hacer las llamadas a métodos en los canales en caché.

La otra ventaja es no tener que rodear todas sus llamadas WCF con declaraciones try/catch/finally para llamar a Close(), Abort(), o Dispose() en el canal cuando haya terminado con ellas. Para mí, parece que WCF dio un paso en la dirección equivocada forzando a los desarrolladores a tener que administrar los recursos del canal WCF. En .NET Remoting, creó el proxy utilizando la clase Activator y no tuvo que hacer nada para limpiarlo. .NET Framework manejó todo eso por ti.

+0

Esta es una buena pregunta. –

Respuesta

10

2 razones principales:

  1. Un ChannelFactory es costoso crear y es seguro para subprocesos => candidato perfecto para el almacenamiento en caché.
  2. Un canal generado por una fábrica de canales no es costoso de crear pero no es seguro para subprocesos (bueno, en realidad es seguro para subprocesos pero las llamadas simultáneas se bloquearán y ejecutarán secuencialmente) => no lo guarde en un entorno multiproceso .

Aquí hay un nice article que entra en más detalles.

+0

No creo que eso sea cierto. Los canales son seguros para hilos. – Bart

+0

@Tom C. aquí hay un [buen artículo] (http://blogs.msdn.com/b/wenlong/archive/2007/10/27/performance-improvement-of-wcf-client-proxy-creation-and- best-practices.aspx) que entra en más detalles. De acuerdo con esto, los canales son seguros para hilos pero bloquean el acceso concurrente y los ejecutan secuencialmente. –

+0

Dependiendo de las opciones de WCF que se usen Los canales pueden contener un estado específico para una determinada sesión. Entonces, el mejor consejo es definitivamente: almacenar en caché la fábrica, no el canal. –

Cuestiones relacionadas