wcf callback dispose

wcf - ¿Debo cerrar y/o descartar los canales de devolución de llamada adquiridos a través de OperationContext.Current.GetCallbackChannel?



dispose (2)

Estoy usando OperationContext.Current.GetCallbackChannel para obtener un canal para el cliente que llamó a una operación de servicio WCF.

¿Debo preocuparme por cerrar / eliminar estos canales de devolución de llamada o el marco de trabajo lo resuelve?


En mi opinión, deberías.

El mecanismo de devolución de llamada no proporciona nada como un protocolo de nivel superior para administrar la conexión entre el servicio y el punto final de devolución de llamada. Depende del desarrollador crear algún protocolo de nivel de aplicación o un patrón consistente para administrar el ciclo de vida de la conexión. El servicio solo puede devolver la llamada al cliente si el canal del lado del cliente aún está abierto, lo que generalmente se logra al no cerrar el proxy. Mantener el proxy abierto también evitará que el objeto de devolución de llamada se recolecte basura. Si el servicio mantiene una referencia en un punto final de devolución de llamada y el proxy del lado del cliente está cerrado o la aplicación del cliente en sí misma se ha ido, cuando el servicio invoca la devolución de llamada obtendrá una ObjectDisposedException del canal de servicio. Por lo tanto, es preferible que el cliente informe al servicio cuando ya no desea recibir devoluciones de llamada o cuando la aplicación del cliente se está cerrando. Para ello, puede agregar un método Disconnect() explícito al contrato de servicio. Dado que cada llamada a método lleva consigo la referencia de devolución de llamada, en el método Disconnect() el servicio puede eliminar la referencia de devolución de llamada de su tienda interna.

aquí hay un ejemplo:

class MyService : IServiceContract { static List<IServiceContractCallback> m_Callbacks = new List<IServiceContractCallback>(); public void Connect() { IServiceContractCallbackcallback = OperationContext.Current.GetCallbackChannel<IServiceContractCallback>(); if(m_Callbacks.Contains(callback) == false) { m_Callbacks.Add(callback); } } public void Disconnect() { IServiceContractCallback callback = OperationContext.Current.GetCallbackChannel<IServiceContractCallback>(); if(m_Callbacks.Contains(callback)) { m_Callbacks.Remove(callback); } else { throw new InvalidOperationException("Cannot find callback"); } }

De esta forma, un cliente puede informar al servicio que la devolución de llamada ya no es necesaria. ¿Responde a tu pregunta?


Bueno, yo mismo lo probé y resulta que si Cierra y Desecha el canal de devolución de llamada (después de enviarlo a IClientChannel), el canal de Servicio completo se vuelve inútil y cuando se llama arroja una excepción ProtocolException:

"Este canal ya no se puede usar para enviar mensajes ya que la sesión de salida se cerró automáticamente debido a un apagado iniciado por el servidor. Desactive el cierre automático estableciendo DispatchRuntime.AutomaticInputSessionShutdown en falso o considere modificar el protocolo de apagado con el control remoto. servidor."

Supongo que esta es una consecuencia no deseada o un efecto secundario al intentar cerrar y eliminar el canal de devolución de llamada, lo que significa que no se debe hacer.