2011-05-05 18 views
20

Estoy tratando de comprender mejor lo que sucede cuando uso un proxy WCF. Tengo problemas para entender lo que sucede cuando cierro (o no cierro) un proxy.¿Qué sucede cuando cierro/aborto un canal/proxy WCF?

  • ¿Qué sucede cuando llamo Cerrar() o Anular() en un proxy WCF? ¿Cual es la diferencia?
  • ¿Cómo difiere entre los tipos de enlaces (como, un sessionless BasicHttpBinding vs. algo sessionful)?
  • ¿Por qué puede Close() arrojar en ciertas situaciones y por qué puede ser una operación de bloqueo?
+0

Se ha escrito mucho acerca de este tema, empezar a buscar en: http://stackoverflow.com/questions/2440608/wcf-service-client-lifetime –

Respuesta

19

Cierre cliente WCF
un cliente tiene una responsabilidad heredada de cerrar la conexión con gracia. Siempre se recomienda cerrar un cliente proxy. Si el enlace entre un cliente y un servicio es de sesión de capa de transporte, entonces cerrar un proxy es esencial para derribar la conexión entre ambas partes. El servicio tiene un umbral de carga útil definido para las conexiones simultáneas. Si el número de conexiones simultáneas supera este umbral linealmente, entonces el rendimiento general del servicio disminuye exponencialmente. Es por eso que es crucial disponer de la conexión lo antes posible. El cierre del proxy también notifica a la instancia del servicio que ya no está en uso y GC puede recopilarlo (sujeto a la administración de la instancia del servicio). Si el cliente no cierra una conexión, todavía se destruye automáticamente por los tiempos de espera de WCF (que se encuentran en los archivos de configuración).

Abortando cliente WCF
En la situación en la que hay un fallo en la interacción de servicios-cliente, los objetos en ambos extremos son potencialmente totalmente roto. Por lo tanto, no se recomienda usar un proxy después de la excepción. Dadas las sesiones de transporte de uso vinculante de WCF, el cliente después de un error ni siquiera podría cerrarlo (si no hubiera una sesión de capa de transporte, entonces el cliente podría usar o cerrar el proxy, pero esto no es recomendable ya que la configuración de sesiones podría cambio). Entonces, después de que ha ocurrido una falla, la única operación segura es abortar un proxy.

Close es una operación sincrónica, se puede tirar si la sesión de transporte ha sido dañado por un fallo y es una operación de bloqueo hasta que se reciba una respuesta de confirmación de servicio (cierto para algunas fijaciones).

+2

Si el número de conexiones simultáneas pasa por encima de este umbral 'linealmente entonces el el rendimiento general del servicio disminuye exponencialmente. ¿Puede ayudarnos a entender este punto? – Abhijeet

+1

Es solo algo que observé en la práctica: la carga y los recursos normalmente se comportan de esta manera. Si uno aumenta la carga, aumenta el rendimiento del rendimiento. Sin embargo, en algún punto (punto de saturación), la carga llega al máximo que una caja puede manejar normalmente. En este punto, obtienes un rendimiento máximo. Si continúa aumentando la carga, el servicio no morirá inmediatamente, sino que "amortiguará" las solicitudes. Esto ayuda a resolver el tráfico de carga de picking, ya que generalmente dura poco tiempo. Pero en nuestro ejemplo, continuaremos aumentando la carga y completaremos algunos buffers internos. Después de la saturación, perf se degrada mucho más rápido. – oleksii

Cuestiones relacionadas