Domanda

Ho seguito di Tomek Janczuk Pub / sub campione utilizzando polling HTTP WCF duplex canale ma ho notato che quando un client si disconnette da chiusura del browser il servizio non fa avviso sul prossimo callback. Mi sarei aspettato un'eccezione o qualcosa da dire che l'endpoint non c'era più.

Come si può sapere quando un client è andato, in modo da interrompere la pubblicazione di quel cliente?

È stato utile?

Soluzione

Sembra che ci sia un insoddisfacente, anche se semplice soluzione:. Se i tempi di client callback fuori, non chiamano di nuovo

Nel mio sistema ho anche implementato un manuale di "controllo" chiamata - ogni n secondi il server chiama un metodo senza parametri attraverso il canale di callback per ogni cliente registrato, solo per vedere se il cliente è ancora qui. Sto iniziando a chiedermi se davvero fosse una buona idea -. Ho un nuovo problema in cui un timeout di richiamata continua che si verificano perché ho sospeso il cliente nel debugger

Altri suggerimenti

Per sapere con certezza: impossibile .

Quando una connessione TCP è chiusa (sottostante una chiamata HTTP), un messaggio speciale TCP viene inviato al server - pacchetto FIN. Sebbene HTTP è stateless, sottostante connessione TCP è stateful e con keep vivo, sottostante connessione TCP solitamente rimane aperto. Se il cliente è disposto, connessione TCP viene chiusa e normalmente un messaggio inviato al server. Ma se si blocca o la sua rete è scollegata, non avrebbe avuto il tempo di fare questo. Quindi, in una parola, non si può mai essere sicuri.

Qui per maggiori informazioni.

E 'difficile, quasi impossibile (causa di funzionalità duplex SL limitata). abbiamo implementato un elenco di utenti nel nostro servizio, e abbiamo aggiunto una proprietà "IsDisconnected" e LastCommunicationTime, una volta che il servizio WCF ottiene un timeout quando tenta di aggiungere un messaggio in uscita-Message-Queue dell'utente e non riesce e genera un'eccezione di timeout. vi segnalo "IsDisconnecte = true" e la prossima volta non cerchiamo di inviare il messaggio a quell'utente.

Un altro thread continua a guardare quel e se si accorge che il LastCommunicationTime è stato superato da un valore del tempo e IsDisconnected = true, rimuove l'utente dalla lista, a meno che gli stessi tentativi all'utente di ottenere di nuovo collegati entro questo periodo di tempo (che identifichiamo con la sua UserId).

Ci sono così tante cose che abbiamo fatto manualmente per gestire questo problema in quanto stava facendo il servizio WCF tanto occupato.

I affrontato questo problema e creato un thread che i clienti rimuove disconnessi con il seguente codice. Funziona bene, ma scende il client disconnesso dalla lista client dopo 10-15 minuti (che era ok per me).

    new Thread(new ThreadStart(() =>
    {
        while (SilverlightClients != null)
        {
                lock (SilverlightClients)
                {
                    SilverlightClients = SilverlightClients.Where(d => (d.Callback as IContextChannel).State != CommunicationState.Opened).ToList();
                }

            Thread.Sleep(1000);
        }
    })) { Name = "Thread Remove Disconnected Clients" }.Start();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top