2009-08-05 1 views
11

Ho un sistema client-server, entrambi i lati scritti da me, e vorrei mettere i client in uno stato "offline" quando il server si disconnette/muore e quindi porta automaticamente tornano "online" quando il server è di nuovo disponibile.WCF: verifica la disponibilità del servizio per il servizio

Per la prima parte, ascolto gli eventi di errore del canale e gestisco impostando il client su offline. Quindi inizio a chiamare un servizio "ping" sul server (ogni 30 secondi) che restituisce un bool solo se è vivo. Una volta che è vivo, il cliente ottiene il bool e torna online.

Tutto questo funziona, il problema che sto avendo è che quando il client chiama il servizio ping e il server è inattivo, nessuna risposta viene inviata (ovviamente) e alla fine, dopo circa 2 minuti ottengo un endpoint non trovato eccezione. A questo punto ho già provato altri 3-4 ping e quindi ho fatto 3-4 eccezioni.

La mia domanda è, come posso gestire il servizio di ping più agevolmente? Idealmente, mi piacerebbe chiamare periodicamente un servizio che mi faccia sapere se è online e immediatamente mi fa sapere se non lo è.

Grazie, Will

risposta

12

Che dire di questo:

  • se si rileva una disconnessione server, immettere una modalità di "Ping"
  • in "modalità ping", si imposta il cliente del " sendTimeout "a qualcosa di molto breve, ad es qualcosa come 2 secondi o giù di lì, dal momento che la tua chiamata al metodo Ping del servizio dovrebbe essere risolta quasi immediatamente
  • una volta che il tuo "Ping" ha funzionato con successo, devi nuovamente ricreare il proxy client e impostare "sendTimeout" del client di nuovo all'originale valore (predefinito è 1 minuto - dipende da cosa ha senso per te, 15 secondi, 30 secondi - qualunque)

In questo modo, se sei in "modalità Ping", ottieni le tue risposte (o timeout) rapidamente e puoi rilevare rapidamente la disponibilità del servizio.

Marc

+0

Grazie Marc, ottima idea questo è quello che ho fatto. Avevo completamente dimenticato che si possono modificare al volo i timeout in questo modo. – WillH

+0

Come rilevare che il server è disconnesso? –

+0

@Ashutosh: se il server è disconnesso, la chiamata fallirà con uno dei numerosi errori possibili ("non trovato" o "timeout" o othesr) –