2009-12-31 15 views
7

Tengo un cliente GUI que se ejecuta contra un servicio WCF alojado como un servicio de Windows en un servidor. El servicio WCF se está ejecutando en PerCall InstanceContextMode, y el cliente tiene una instancia singleton del cliente de servicio y quiero evitar la reinstalación del singleton en cada llamada, ya que dificulta las muchas llamadas asíncronas que tengo.Manejo del reinicio del servicio WCF en el lado del cliente

El problema para mí es, después de que el servicio de Windows se reinicia cada vez que el cliente realiza una llamada que llegue un mensaje de excepción de esta manera:

Este canal ya no se puede utilizar para enviar mensajes como la salida la sesión se cerró automáticamente debido a un apagado iniciado por el servidor. Deshabilite el cierre automático configurando DispatchRuntime.AutomaticInputSessionShutdown como falso, o considere modificar el protocolo de apagado con el servidor remoto.

¿Cuál es la mejor manera de evitar esto? Puedo poner cláusulas try-catch alrededor de todas las llamadas al cliente de servicio y reinstalar la instancia singleton en excepciones de comunicación, pero eso implicará un gran número de código repetitivo.

Respuesta

9

Lo mejor sería evitar las excepciones en el servidor juntos. Si un servidor WCF encuentra una excepción que no está siendo capturada y manejada, "fallará" el canal, dejándolo inútil.

En el lado del servidor, puede implementar el IErrorHandler interface y atrapar las excepciones .NET, convirtiéndolas en fallas SOAP que se le devolverán al cliente con mayor gracia, sin fallar el canal.

De esta forma, puede capturar todas las excepciones .NET en el servidor y convertirlas en fallas SOAP interoperables que no causarán estos problemas.

Para obtener más información, ver:

+0

gracias, lea estos y fueron de gran ayuda – theburningmonk

+5

El problema con esta excepción ProtocolException es que el estado del canal sigue siendo "Abierto", no "Fallado", y es muy difícil darse cuenta de que, de hecho, no se puede usar. –

+2

¿Y qué hace uno cuando el servicio WCF está alojado en IIS y en lugar de reiniciarse debido a una excepción, el servicio se reinicia para volver a implementarse? – alimbada

Cuestiones relacionadas