2011-09-02 16 views
6

Ho un servizio WCF duplex di lavoro con WSDualHttpBinding. Il mio problema è trovare un modo per memorizzare il canale di callback con un ID univoco. Il servizio è destinato a essere di lunga durata. Posso semplicemente prendere il valore di ritorno OperationContext.Current.GetCallbackChannel() quando viene chiamato un metodo "Iscriviti" e memorizzarlo in un elenco o dizionario? È garantito che sia valido fino a quando la connessione è attiva?Identificazione dei client in un servizio WCF

risposta

5

Il modo più semplice sarebbe avere il client inviare un valore chiave nel metodo Iscriviti del servizio. È quindi possibile salvare il canale di richiamata in un dizionario. Questo dizionario dovrebbe probabilmente essere una variabile statica o una classe singleton la cui durata è maggiore della durata della classe di servizio poiché la maggior parte della classe di servizio ha una durata di PerCall e viene eliminata dopo il completamento della chiamata di servizio. Attenzione ai problemi di threading!

Il canale di richiamata può essere riscontrato in qualsiasi momento sul client o sul lato assistenza. Il servizio deve gestire la possibilità di un canale guasto e rimuovere il canale guasto dal dizionario. WSDuallHttpBinding è un'associazione "stateless" in modo che eventuali errori nel client non vengano rilevati sul lato del servizio finché il servizio non tenta di chiamarli. NetTcpBinding solleverà l'evento ChannelFaulted se il client si trova in uno stato di errore. Per questo motivo raccomando NetTcpBinding se soddisfa i tuoi requisiti.

public bool Subscribe(string id) { 
     ICallback callback = OperationContext.Current.GetCallbackChannel(); 
     if (!_activeCallbackChannels.Contains(id)) { 
      _activeCallbackChannels.Add(id, callback); 
      return true; 
     } 
     else { 
      return false; 
     } 

    } 
Problemi correlati