2009-04-02 7 views
12

¿Qué debo hacer para activar un evento cuando un nuevo cliente se conecta al servicio alojado en WCF?Evento de incendio cuando el cliente se conecta al punto extremo alojado en WCF

EDITAR: Lo que estoy buscando es obtener un evento cuando se crea una nueva sesión o se crea un nuevo canal para un cliente. Como por ejemplo: para el cierre de sesión que estoy usando:

OperationContext.Current.Channel.Closed += new EventHandler(Channel_Closed); 

así que lo que debo utilizar para la sesión iitiation?

Respuesta

5

Creo que lo que estamos tratando de lograr es mejor hacerlo mediante la adición de un nuevo channel initializer al oyente (s) de servicio después de su creación.

Básicamente, usted crea una clase que implementa esa interfaz, luego la agrega al host del servicio. Si está autoalojamiento esto es bastante simple:

public class MyHook : IChannelInitializer 
{ 
    public void Initialize(IClientChannel channel) 
    { 
    // Do whatever. 
    } 
} 

var host = new ServiceHost(typeof(MyService), MYBASEADDRESS); 
host.AddServiceEndpoint(typeof(IMyService), new WSHttpBinding(), MYSERVICEADDRESS); 
host.Open(); 

// There will be one per endpoint; you can enumerate them if needed etc. 
var dispatcher = host.ChannelDispatchers[0] as ChannelDispatcher; 
dispatcher.ChannelInitializers.Add(new MyHook()); 

dado que está utilizando el modo de instancia por sesión, obtendrá un nuevo canal creado para cada nueva sesión, la primera vez que un cliente se conecta. El despachador de canal es el objeto que es responsable de tomar el canal recién creado y asociarlo con una instancia de objeto de servicio particular (no hace correspondencia de direcciones, etc.). Ejecutará cada uno de los inicializadores personalizados en el nuevo canal antes de que su servicio se conecte a él.

+0

¡Gracias! Eso sí responde mi pregunta exactamente – galets

+0

Para informaciones adicionales ver: http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/14/wcf-extensibility-initializers-instance-context-channel-call-context. aspx Especialmente para WCF 4.0, la forma propuesta no funcionará porque se lanza una excepción después de que el host transmita al estado abierto. –

0

Depende de su configuración: ¿realiza conversaciones "por llamada"? Entonces realmente no recibe ningún mensaje de "cliente ahora conectado" per se ...

¿Realiza conversaciones basadas en sesiones? Su clase "ServiceHost" tiene dos eventos "Apertura" y "Abierto", en los que puede enganchar, especialmente si autoejecuta su servicio.

¿Qué es exactamente lo que quieres lograr atrapando este evento?

Marc

+2

Basado en la sesión. El host del servicio desencadena el evento Abierto cuando el host del servicio se inicia, por ejemplo, en la llamada host.Open(), no cuando el nuevo cliente se conecta al – galets

+1

¿tiene algún consejo si es InstanceContextMode.Single? – arconaut

Cuestiones relacionadas