Escuchar eventos entre capas

12/05/2004 - 18:17 por Miguel Arias Fernández | Informe spam
Hola:

He creado un servidor remoto en C# con sus puertos, canales, etc. y un
cliente que se 'engancha' a los objetos que se activan.

Antes de pasar la aplicación a 'remoting' tenía un objeto que lanzaba un
evento que era recogido por el cliente. Ahora en remoting no funciona...
¿alguién sabe como generar un evento en un objeto remoto que puede recogerse
en el cliente?

Un saludo y Gracias, Miguel
 

Leer las respuestas

#1 Angel J. Hernández
16/05/2004 - 15:34 | Informe spam
Saludos...

La manera cmo funciona en Remoting no difiere mucho de la manera
tradicional. Vayamos por paso, el objeto remoto debe derivar de
MarshalByRefObject. Necesitas un delegado (Callback) para poder realizar
disparar el evento, por ejemplo

public delegate void StatusEvent(object sender, StatusEventArgs e)

este reside en el objeto remoto al igual que el evento a consumir digamos...

public event StatusEvent Status;

Todo hasta acá es similar o igual a como se hace sin Remoting. Sin embargo
hay que hacer un tratamiento especial con los argumentos (clase
StatusEventArgs) su declaración es similar a la de cualquier clase de
argumento pero esta ha de estar marcada con el atributo de [Serializable] es
decir...

[Serializable]
public class StatusEventArgs {
private string m_message;

public string Message {
get {return m_message;}
set {m_message = value;}
}

public StatusEventArgs(string m) {
m_message = m;
}
}

Otra nota es... No es posble utilizar objetos SingleCall con eventos, debido
a que el cliente primero registra el manejador de evento y después llama al
método remoto por ende el objeto remoto debe guardar el estado del cliente,
entonces en el archivo de configuración puedes especificar esto...

<configuration>
<system.runtime.remoting>
<application name="miejemplo">
<service>
<activated type="namespace.clase.objetoremoto, objetoremoto"/>
</service>
<channels>
<channel ref = "http" port="4500" />
</channels>
</application>
<system.runtime.remoting>
</configuration>

Necesitas implementar también un EventSink que encapsulará el disparo del
evento...

using System;
using System.Runtime.Remoting.Messaging;

namespace tunamespace {
public class EventSink: MarshalByRefObject {
public EventSink() {}

[OneWay]
public void StatusHandler(object sender, StatusEventArgs e) {
Console.WriteLine("Event Sink: "+e.Message);
}
}
}

Después finalizamos como el cliente, digamos que estamos en el Main()...

RemotingConfiguration.Configure("cliente.exe.config");
EventSink sink = new EventSink();
RemoteObject obj = new RemoteObject();
obj.Status += new StatusEvent(sink.StatusHandler);

Y con esto estamos listo... solo queda establecer unas opciones en la
configuración del archivo del cliente y terminamos...

<configuration>
<system.runtime.remoting>
<application name="cliente">
<client url=http://localhost:4500/miejemplo>
<activated type="namespace.clase.objetoremoto, objetoremoto"/>
</client>
<channels>
<channel ref = "http" port="1000" />
</channels>
</application>
<system.runtime.remoting>
</configuration>

Con eso tenemos...

Saludos y espero te sirva...

Angel J. Hernández M.
MCP

http://groups.msn.com/DesarrolladoresMiranda

"Miguel Arias Fernández" escribió en el mensaje
news:
Hola:

He creado un servidor remoto en C# con sus puertos, canales, etc. y un
cliente que se 'engancha' a los objetos que se activan.

Antes de pasar la aplicación a 'remoting' tenía un objeto que lanzaba un
evento que era recogido por el cliente. Ahora en remoting no funciona...
¿alguién sabe como generar un evento en un objeto remoto que puede


recogerse
en el cliente?

Un saludo y Gracias, Miguel


Preguntas similares