.NET Remoting y eventos

28/09/2004 - 12:31 por Mythox | Informe spam
Hola tod@s:

Estoy implementando unas pruebas con .NET Remoting y me han surgido algunos
problemas al intentar usar los delegados en los objetos de tipo
"MarshalByRefObject":

Tengo una clase llamada "Proxy" que extiende de "MarshalByRefObject".
Registro el objeto remoto de esta forma:

//Registrando el channel (HTTP) puerto 8080
ChannelServices.RegisterChannel(new HttpChannel(8080));
//Registrando ativaçà£o server-si
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Proxy), //tipo
"ProxyURI", //URI
WellKnownObjectMode.Singleton //modo
);
Luego lo utilizo:

//Registrando el channel (HTTP)
ChannelServices.RegisterChannel(new HttpChannel(0));
//Registrando el client
RemotingConfiguration.RegisterWellKnownClientType(
typeof(Proxy), //tipo
"http://localhost:8080/ProxyURI" //URI
);
try {
//Instanciamento e invocación del objeto remot
p = new Proxy();
p.Evento += new Delegado(p_Evento);
} catch (System.Net.WebException wex) {
Console.WriteLine(wex.Message);
}

Al ejecutar la linea:

p.Evento += new Delegado(p_Evento);

Me da un error de seguridad "SecurityException", dice lo siguiente:

Type System.DelegateSerializationHolder and the types derived from it (such
as System.DelegateSerializationHolder) are not permitted to be deserialized
at this security level.

No se a que se debe, si alguien puede ayudarme a comprender el porque,
gracias.

Preguntas similare

Leer las respuestas

#1 A.Poblacion
28/09/2004 - 12:55 | Informe spam
¿Estás usando el framework 1.1? En esta versión cambiaron los ajustes de
seguridad respecto a la 1.0, y ciertas cosas que antes funcionaban dan
errores parecidos al que has puesto en la versión 1.1. Se arregla con un
código parecido al siguiente:


BinaryClientFormatterSinkProvider clientProvider = new
BinaryClientFormatterSinkProvider();
BinaryServerFormatterSinkProvider serverProvider = new
BinaryServerFormatterSinkProvider();
serverProvider.TypeFilterLevel System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
IDictionary props = new Hashtable();
props["port"] = 0;
string s = System.Guid.NewGuid().ToString();
props["name"] = s;
props["typeFilterLevel"] System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
TcpChannel CanalDeComunicacion = new
TcpChannel(props,clientProvider,serverProvider);
ChannelServices.RegisterChannel(CanalDeComunicacion);


"Mythox" wrote in message
news:
Hola :

Estoy implementando unas pruebas con .NET Remoting y me han surgido


algunos
problemas al intentar usar los delegados en los objetos de tipo
"MarshalByRefObject":

Tengo una clase llamada "Proxy" que extiende de "MarshalByRefObject".
Registro el objeto remoto de esta forma:

//Registrando el channel (HTTP) puerto 8080
ChannelServices.RegisterChannel(new HttpChannel(8080));
//Registrando ativaçà£o server-si
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Proxy), //tipo
"ProxyURI", //URI
WellKnownObjectMode.Singleton //modo
);
Luego lo utilizo:

//Registrando el channel (HTTP)
ChannelServices.RegisterChannel(new HttpChannel(0));
//Registrando el client
RemotingConfiguration.RegisterWellKnownClientType(
typeof(Proxy), //tipo
"http://localhost:8080/ProxyURI" //URI
);
try {
//Instanciamento e invocación del objeto remot
p = new Proxy();
p.Evento += new Delegado(p_Evento);
} catch (System.Net.WebException wex) {
Console.WriteLine(wex.Message);
}

Al ejecutar la linea:

p.Evento += new Delegado(p_Evento);

Me da un error de seguridad "SecurityException", dice lo siguiente:

Type System.DelegateSerializationHolder and the types derived from it


(such
as System.DelegateSerializationHolder) are not permitted to be


deserialized
at this security level.

No se a que se debe, si alguien puede ayudarme a comprender el porque,
gracias.


Respuesta Responder a este mensaje
#2 Angel J. Hernández
28/09/2004 - 16:04 | Informe spam
Saludos...

La manera como 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.
MCSD




"Mythox" escribió en el mensaje
news:
Hola :

Estoy implementando unas pruebas con .NET Remoting y me han surgido
algunos
problemas al intentar usar los delegados en los objetos de tipo
"MarshalByRefObject":

Tengo una clase llamada "Proxy" que extiende de "MarshalByRefObject".
Registro el objeto remoto de esta forma:

//Registrando el channel (HTTP) puerto 8080
ChannelServices.RegisterChannel(new HttpChannel(8080));
//Registrando ativaçà£o server-si
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Proxy), //tipo
"ProxyURI", //URI
WellKnownObjectMode.Singleton //modo
);
Luego lo utilizo:

//Registrando el channel (HTTP)
ChannelServices.RegisterChannel(new HttpChannel(0));
//Registrando el client
RemotingConfiguration.RegisterWellKnownClientType(
typeof(Proxy), //tipo
"http://localhost:8080/ProxyURI" //URI
);
try {
//Instanciamento e invocación del objeto remot
p = new Proxy();
p.Evento += new Delegado(p_Evento);
} catch (System.Net.WebException wex) {
Console.WriteLine(wex.Message);
}

Al ejecutar la linea:

p.Evento += new Delegado(p_Evento);

Me da un error de seguridad "SecurityException", dice lo siguiente:

Type System.DelegateSerializationHolder and the types derived from it
(such
as System.DelegateSerializationHolder) are not permitted to be
deserialized
at this security level.

No se a que se debe, si alguien puede ayudarme a comprender el porque,
gracias.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida