2011-09-02 22 views
6

Tengo un servicio WCF dúplex en funcionamiento con WSDualHttpBinding. Mi problema es encontrar una forma de almacenar el canal de devolución de llamada con una identificación única. El servicio está destinado a ser de larga duración. ¿Puedo simplemente tomar el valor de retorno OperationContext.Current.GetCallbackChannel() cuando se llama a un método "Suscribirme" y almacenarlo en una lista o diccionario? ¿Se garantiza que será válido hasta que la conexión esté activa?Identificación de clientes en un servicio WCF

Respuesta

5

La manera más fácil sería que el cliente envíe un valor de clave en el método de suscripción de su servicio. A continuación, puede guardar el canal de Devolución de llamada en un diccionario. Este diccionario probablemente necesite ser una variable estática o una clase única cuya vida útil sea mayor que la vida útil de la Clase de servicio, ya que la mayoría de las clases de servicio tienen una vida útil PerCall y se eliminan después de que se complete la llamada de servicio. ¡Cuidado con los problemas de enhebrado!

El canal de devolución de llamada se puede generar una falla en cualquier momento, ya sea en el cliente o en el lado del servicio. El servicio debe manejar la posibilidad de un canal con falla y eliminar el canal con fallas del diccionario. WSDuallHttpBinding es un enlace "sin estado" por lo que las fallas en el cliente no se detectarán en el lado del servicio hasta que el lado del servicio intente llamarlas. NetTcpBinding generará el evento ChannelFaulted si el cliente entra en estado de error. Por esa razón, recomendaría NetTcpBinding si se ajusta a sus requisitos.

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

    } 
Cuestiones relacionadas