2009-11-03 20 views
5

Tengo un servicio WCF que he escrito, alojado dentro de un servicio de Windows. Está operando en modo PerSession. El servicio permite a los clientes abrir archivos, realizar cambios en los archivos y cerrar archivos de forma remota a través del servicio. Hasta ahora todo funciona muy bien.Finalice elegantemente el servicio WCF: complete todas las sesiones abiertas y restrinja las nuevas sesiones

Cuando se detiene el servicio de Windows, me gustaría que el Servicio WCF no acepte ninguna sesión nueva y permita que los clientes ya conectados completen sus sesiones actuales y el trabajo (dentro de un período/tiempo de espera razonable).

¿Cuál sería la mejor manera de lograr esto?

Respuesta

7

Básicamente, llamando al ServiceHost.Close() logrará esto: permitirá que todas las solicitudes actualmente en ejecución se ejecuten hasta su finalización, pero se rechazarán nuevas solicitudes si el cierre ordenado está en progreso.

Hay una configuración "CloseTimeout" en su enlace que ha configurado para su servicio, que controla cuánto tiempo el motor de ejecución WCF permitirá ejecutar las solicitudes hasta que se hayan cerrado correctamente. Si ocurre ese tiempo de espera, las solicitudes que aún se ejecutan se eliminarán.

El método ServiceHost.Abort(), por otro lado, es el equivalente digital de una almádena: todas las solicitudes en ejecución terminan a la vez, y el host se apaga.

En el lado del cliente, tiene los mismos métodos .Close() y .Abort() en su cliente proxy que se comportan de la misma manera.

+0

llamando a ServiceHost.Close hace que mi servicio cierre inmediatamente las conexiones del cliente. No tengo el cierre ordenado que deseo. ¿Hay alguna configuración que modifique este comportamiento? –

+0

@David: no, no estoy al tanto de ninguna configuración para activar esto - este debería ser el comportamiento predeterminado - cualquier llamada de servicio que todavía esté en curso debería completarse ordenadamente. Sin embargo, esto no mantiene las sesiones existentes abiertas hasta que finalicen; se cerrarán si no se está ejecutando ninguna llamada de servicio. –

+0

@marc_s: Lo que veo es que ServiceHost.Close permite que ServiceHost complete cualquier llamada de servicio en curso, PERO mis clientes ya han recibido System.ServiceModel.CommunicationException y nunca reciben la respuesta. ¿Es esto lo que esperarías? ¿Alguna solución? Está bien si los clientes reciben una excepción al realizar nuevas llamadas de servicio, pero cualquier llamada de servicio que se estaba ejecutando cuando se llamó a ServiceHost.Close necesita completar y devolver los valores esperados al cliente. –

Cuestiones relacionadas