2009-10-29 12 views
5

Possiedo un servizio Windows che ospita tre diversi canali WCF duplex. I client possono connettersi per ricevere gli aggiornamenti inviati tramite il loro contratto di callback. Essenzialmente ci sono tre canali pub-sub.WCF: chiusura di un servizio duplexServeri di blocco per la durata CloseTimeout se chiusi quando i client sono connessi

Questo servizio richiede molto tempo per rimbalzare quando i client sono connessi. La chiamata a ServiceHost.Close richiede 10 secondi per tornare (quindi il servizio impiega più di 30 secondi per fermarsi.) Si scopre che il mio closeTimeout in configurazione è di 10 secondi. La modifica di questo valore indica che questa è la causa del problema.

Cosa devo fare per chiudere il canale tempestivamente? Non mi piace l'idea che qualcosa stia scadendo. Potrei chiamare Abort, ma sembra che ci debba essere un modo migliore. Non l'ho mai visto su canali non duplex, quindi supponiamo che abbia a che fare con il duplex.

Idealmente, il client verrebbe informato immediatamente che il canale ha avuto un errore, in modo che l'utente possa vedere immediatamente che gli aggiornamenti si sono fermati.

risposta

0

Probabilmente, il modo migliore è di notificare il client (si dispone di un duplex, quindi è possibile) e lasciare che il client chiuda il canale.

+1

Hai provato questo? Cosa vuol dire che l'altra estremità del canale non bloccherà anche per 'CloseTimeout'? –

+0

Questo è il modo in cui utilizzo WCF e non ho mai avuto problemi come il tuo. Potrebbe essere coincidente, potrebbe non esserlo. Ho appena condiviso la mia esperienza. – adontz

1

"Idealmente, il client verrebbe informato immediatamente che il canale ha avuto un errore, in modo che l'utente possa vedere immediatamente che gli aggiornamenti si sono fermati."

L'istanza del client WCF ha eventi è possibile abbonarsi:

  • Chiuso
  • Chiusura
  • Faulted
  • Aperto
  • apertura.

Il Faulted evento viene generato non appena il canale duplex fermato da qualsiasi motivo.

Mi chiedo perché il tuo host di servizio impiega più di 30 secondi per chiudersi. Puoi fornire qualche codice di esempio?

+0

IIRC, il canale rileva solo che è in errore quando si tenta effettivamente di fare qualcosa con esso, o se si imposta un heartbeat (nel qual caso c'è ancora un ritardo). –