Как клиентский объект (прокси) регистрируется на событие, которое должно быть запущено на стороне сервера? - PullRequest
1 голос
/ 22 мая 2009

Я хотел бы создать класс, в котором клиентская сторона (прокси) экземпляра объекта может зарегистрироваться в событии (или делегате) и получать информацию всякий раз, когда это событие запускается на стороне сервера.

Я пытался напрямую, но получаю SecurityException, информирующее меня о том, что System.DelegateSerializationHolder не может быть сериализовано на этом уровне безопасности.

Есть ли способ обойти это?

Пример:

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

Ответы [ 2 ]

1 голос
/ 22 мая 2009

Нет. Во всяком случае, не напрямую.

Вы можете выбрать, чтобы клиент перезвонил на сервер и зарегистрировал на нем порт для внешнего управления с сервера. Это может открыть все виды проблем безопасности.

Вероятно, наилучшим способом было бы опросить сервер, чтобы узнать, нужно ли обрабатывать какие-либо события. Это оставляет контроль над информационными запросами в домене клиентов, и именно так Microsoft Exchange и другие продукты, с которыми я работал, имеют тенденцию обрабатывать этот сценарий.

0 голосов
/ 01 февраля 2010

Да, это возможно, но по умолчанию оно отключено.

Уровень десериализации .net Remoting по умолчанию - Low, что не позволяет делегатам проходить через границу Remoting. Вы можете создать собственный BinaryServerFormatterSinkProvider с уровнем десериализации Full и передать этого провайдера на свой канал (на стороне сервера).

Вот пример VB.NET; см. статью MSDN о Автоматическая десериализация в .NET Framework Remoting для примера C #.

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