2010-07-03 28 views
7

¿Qué hace OperationContext.Current.GetCallbackChannel en realidad? ¿Cómo identifica a todos y cada uno de los clientes?¿Qué hace realmente "OperationContext.Current.GetCallbackChannel"?

Tengo un problema en mi servicio WCF. Si más de dos usuarios se conectan al servicio, todos los "cambios interesantes" que estoy enviando desde el servicio a los clientes pasarán al segundo usuario unido.

Por ej, si A, B, C, D se une al servicio si puedo enviar los cambios a C y D a través de devolución de llamada que va a B.

¿Alguna idea?

detalles:

Cliente: aplicación web ASP.NET

Encuadernación: NetTcpBinding

Update1

Okie, he encontrado la causa del problema. He alojado el cliente asp.net en IIS. Por ejemplo, la URL del cliente es http://url1. Si abro varias instancias de la página en una máquina diferente y me uno al servicio, el canal de devolución de llamada siempre apunta a la primera instancia de la página (abro el sitio desde diferentes máquinas). Pero si alojo el cliente asp.net en diferentes sitios en IIS, los canales de devolución de llamada son únicos. ¿Alguna idea sobre eso?

+3

Ya te dije que lo que estás haciendo no funcionará. Este comentario no es para ti, es para otros que lo lean más tarde. No **, nunca ** intente volver a llamar o hacer referencia a una página ASP.NET una vez que se complete la solicitud. La página no existirá –

+1

Gracias por su comentario John. Estaba investigando más sobre cómo funciona la devolución de llamada. Lo que sea que hayas dicho ya ** tiene perfecto sentido **. No estoy intentando más en la misma dirección. – NLV

Respuesta

6

Cuando el servicio recibe una llamada, OperationContext.Current.GetCallbackChannel devuelve un canal a esa persona. No devuelve un canal que difunde a todos los clientes.

De su pregunta, es posible que solo esté almacenando la devolución de llamada que se recuperó en la última llamada. De hecho, debe almacenar una lista que contenga cada instancia única de devolución de llamada que se haya recuperado. Cada vez que se llama a un método, agrega la instancia de devolución de llamada a esta lista. Cuando desee transmitir, debe recorrer cada elemento de la lista y realizar la llamada necesaria.

Si su servicio utiliza el modo de instancia Singleton, el objeto de implementación puede almacenar una lista de instancias de devolución de llamada como un miembro de datos. Si su servicio utiliza el modo de instancia Cliente o SingleCall, entonces podría tener un objeto global que contenga la lista de instancias de devolución de llamada.

+0

Sí. Así es como lo estoy haciendo exactamente. Estoy usando [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)] para mi servicio. Pero sigo teniendo el mismo problema. Ahora he creado un diccionario para almacenar los canales de devolución de llamada. Todavía todos los canales de devolución de llamada para los usuarios se unieron después de que el segundo usuario (del tercer usuario) siempre señala al segundo usuario. Estoy siguiendo este gran artículo - http: // www.codeproject.com/KB/WCF/WCFWPFChat.aspx por Sacha Barber. – NLV

+0

¿Es eso "OperationContext.Current.GetCallbackChannel" se basa en el objeto proxy que uso para llamar al servicio desde el cliente? – NLV

+0

Actualicé mi publicación. Compruébelo por favor. – NLV

1

Debe configurar su servicio para crear un hilo separado para cada sesión. Eche un vistazo a http://msdn.microsoft.com/en-us/library/cc681240.aspx

+0

Sí, lo sé. He configurado el modo de sesión y el contexto de la instancia y otras configuraciones necesarias para crear un contrato dúplex con devolución de llamada. Toda mi pregunta es cómo realmente crea un canal con el cliente? – NLV

Cuestiones relacionadas