2009-05-21 4 views
1

Je voudrais créer une classe où le côté client (proxy) de l'objet instancié peut s'inscrire à un événement (ou un délégué) et être informé chaque fois que cet événement est déclenché du côté serveur.Comment un objet côté client (proxy) s'inscrit-il dans un événement à déclencher côté serveur?

J'ai essayé directement mais je reçois un SecurityException m'informant que System.DelegateSerializationHolder ne peut pas être sérialisé à ce niveau de sécurité.

Y a-t-il un moyen de contourner cela?

Exemple:

MyClass proxy = Activator.GetObject(typeof(MyClass), uri) as MyClass; 
proxy.OnMyEvent += new MyEventHandler(this.Callback); 

Répondre

1

Non, pas directement en tout cas.

Vous pouvez soit rappeler le client au serveur et enregistrer avec lui un port pour les contrôles hors bande du serveur. Cela pourrait ouvrir toutes sortes de problèmes de sécurité.

Le meilleur moyen serait probablement que le client interroge le serveur pour voir si des événements doivent être traités. Cela laisse le contrôle des demandes d'information dans le domaine des clients, et c'est la façon dont Microsoft Exchange et les autres produits avec lesquels j'ai travaillé tendent à gérer ce scénario.

0

Oui, c'est possible, mais il est désactivé par défaut.

Le niveau de désérialisation par défaut .net Remoting est Low, ce qui ne permet pas aux délégués de passer la limite Remoting. Vous pouvez créer un BinaryServerFormatterSinkProvider personnalisé avec un niveau de désérialisation de Full et transmettre ce fournisseur à votre canal (côté serveur).

Voici un exemple VB.NET; voir the MSDN article on Automatic Deserialization in .NET Framework Remoting pour un exemple C#.

Dim myChannel = New TcpServerChannel("", myPort, _ 
            New BinaryServerFormatterSinkProvider() With {.TypeFilterLevel = Runtime.Serialization.Formatters.TypeFilterLevel.Full})