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:
- Quién debe cerrar el canal de comunicación? El cliente o el servidor
- ¿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 ...
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