2009-10-29 22 views
5

Tengo un servicio de Windows que aloja tres canales dúplex WCF diferentes. Los clientes pueden conectarse para recibir actualizaciones a través de su contrato de devolución de llamada. Básicamente, hay tres canales pub-sub.WCF - Cerrar un dúplex ServiceHost bloquea la duración de CloseTimeout si se cierra cuando los clientes están conectados

Este servicio demora mucho tiempo en rebotar cuando los clientes están conectados. La llamada a ServiceHost.Close tarda 10 segundos en volver (por lo que el servicio tarda más de 30 segundos en detenerse). Resulta que mi closeTimeout en configuración es de 10 segundos. Cambiar este valor indica que esta es la causa del problema.

¿Qué debo hacer para cerrar el canal con prontitud? No me gusta la idea de que algo esté pasando el tiempo. Podría llamar al Abort, pero parece que debe haber una mejor manera. No he visto esto antes en canales no dúplex, así que supongo que tiene algo que ver con que sea dúplex.

Idealmente, el cliente sería notificado inmediatamente de que el canal había fallado, de modo que el usuario pudiera ver inmediatamente que las actualizaciones se habían detenido.

Respuesta

0

Probablemente, la mejor manera es notificar al cliente (tiene dúplex, por lo que puede) y dejar que el cliente cierre el canal.

+1

¿Has probado esto? ¿Qué quiere decir que el otro extremo del canal no bloqueará para 'CloseTimeout' también? –

+0

Esta es la forma en que uso WCF y nunca tuve un problema como el suyo. Puede ser coincidente, puede ser que no. Solo compartí mi experiencia. – adontz

1

"Idealmente, el cliente sería notificado inmediatamente de que el canal había fallado, de modo que el usuario pudiera ver de inmediato que las actualizaciones se han detenido".

La instancia de cliente WCF tiene eventos se puede suscribir:

  • cerrado
  • Cierre
  • Faulted
  • abierto
  • Apertura.

El Faulted evento se produce tan pronto como su canal dúplex detenido desde cualquier motivo.

Me pregunto por qué su servidor de servicios tarda más de 30 segundos en cerrarse. ¿Puedes proporcionar algún código de muestra?

+0

IIRC, el canal solo detecta que tiene una falla cuando realmente intentas hacer algo con él, o si configuras un latido (en cuyo caso todavía hay un retraso). –

Cuestiones relacionadas