2011-12-13 10 views
7

Tengo problemas/preguntas al cerrar un canal de comunicación de devolución de llamada/dúplex. Éstos son mis prototípicos interfaces de WCF:Interfaz de devolución de llamada WCF - Quién cierra el canal

[ServiceContract(CallbackContract = typeof(IMyInterfaceCallback))] 
public interface IMyInterface 
{ 
    [OperationContract] 
    void StartWork(); 
} 

public interface IMyInterfaceCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    void WorkFeedback(); 
} 

En el lado del cliente Creo mi interfaz WCF a través de:

DuplexChannelFactory<IMyInterface> dcf = new DuplexChannelFactory<IMyInterface>(implOfIMyInterfaceCallback, customBinding, ea); 
IMyInterface myInterface = dcf.CreateChannel(); 

En el lado servidor, entonces yo uso

OperationContext.Current.GetCallbackChannel<IMyInterfaceCallback>(); 

para recuperar el puntero de devolución de llamada, que luego se puede utilizar para comunicarse con el cliente.

Mis preguntas ahora son:

  1. Quién debe cerrar el canal de comunicación? El cliente o el servidor
  2. ¿Qué objetos de comunicación deben cerrarse? La interfaz original (IMyInterface) o la interfaz de devolución de llamada (IMyInterfaceCallback) o ambas.

Traté de cerrar la interfaz de devolución de llamada en el lado del servidor, en el momento en que el servidor sabe que no hará más devoluciones de llamada. El uso de ICommunicationObject :: Close en la interfaz de devolución de llamada, sin embargo, dio como resultado una operación de bloqueo de un minuto.

Cerrar en el lado del cliente en mi opinión no es la forma correcta, ya que el cliente no sabe si hay más devoluciones de llamada que se esperan.

Gracias por cualquier ayuda. Frank

PS: Esta parece ser una pregunta muy básica, pero hasta ahora no he encontrado ninguna información útil en la búsqueda a través de Google o en StackOverflow ...

Respuesta

3

El DuplexChannel utiliza una conexión TCP bajo el capó, y así es como emula una comunicación bidireccional. Sin embargo, el cliente es quien siempre abre esa conexión, por lo que también es el responsable de cerrarla (piense en un socket TCP). Por lo tanto, debe usar la interfaz de cliente IMyInterface (que se deriva de IClientChannel) para cerrarla.

Saludos Pablo.

6

El cliente debe cerrar el canal de servicio (como es normal).

El canal de devolución de llamada adquirido a través de GetCallbackChannel no debe cerrarse en mi experiencia (Ver esta pregunta relacionada mío: Do I need to Close and/or Dispose callback channels acquired through OperationContext.Current.GetCallbackChannel?)

Al cerrar el canal que debe utilizar el patrón preferido:

Try 
    channel.Close() 
Catch ex As Exception 
    channel.Abort() 
End Try 

Debido el cliente (por lo general) no puede saber si todavía hay algún mensaje en curso al intentar cerrar el canal, lo que daría lugar a una excepción.

+0

Gracias por la información, ahora estoy cerrando el canal en el lado del cliente y todo está bien. Sin embargo, estoy verificando el estado antes del cierre, p. si está fallado, llame directamente a Abort(). Pero su código de cierre también debería funcionar bien. – FrankE

Cuestiones relacionadas