客户端对象(代理)如何注册到服务器端的事件?

时间:2009-05-21 21:51:21

标签: c# .net remoting

我想创建一个类,其中实例化对象的客户端(代理)可以注册到事件(或委托),并在服务器端触发此事件时被通知。

我直接尝试但是我收到SecurityException通知我System.DelegateSerializationHolder无法在此安全级别序列化。

有解决方法吗?

示例:

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

2 个答案:

答案 0 :(得分:1)

没有。不管怎么说都不是。

您的选择是让客户端回调服务器并向其注册一个端口,用于从服务器进行带外控制。这可能会引发各种安全问题。

可能最好的方法是让客户端轮询服务器以查看是否需要处理任何事件。这样就可以在客户端域中控制信息请求,而且我与之合作的Microsoft Exchange和其他产品也倾向于处理这种情况。

答案 1 :(得分:0)

是的,有可能,但默认情况下已停用。

默认的.net远程处理反序列化级别为Low,它不允许代理通过远程处理边界传递。您可以创建一个反序列化级别为Full的自定义BinaryServerFormatterSinkProvider,并将此提供程序传递给您的频道(在服务器端)。

这是一个VB.NET示例;有关C#示例,请参阅the MSDN article on Automatic Deserialization in .NET Framework Remoting

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