Я пытаюсь осмыслить удаленное взаимодействие .NET в попытке воспроизвести в .NET VB6 ActiveX EXE.
Пока что у меня есть синглтон, созданный на сервере, которым могут пользоваться все клиенты.
Синглтон принимает запросы от клиентов и проверяет данные, возвращая проверенные данные в виде события. Это прекрасно работает - классы, которые запрашивают ссылку на синглтон, запускают свои события - то есть они отправляют данные, получают проверенные данные.
Однако мне нужен интерфейс для этого. Клиенты размещаются в приложении WPF (сервер тоже), и когда они получают данные, мне нужно обновить отображение (текстовое поле, список, что угодно), чтобы отразить связь между клиентами и синлглетоном.
Однако, как только я добавляю событие, реализованное в основной форме для вызова клиента после получения ответа от синглтона, я сталкиваюсь с ошибками времени выполнения с жалобами на то, что основная форма не имеет атрибутов сериализации ...
Для краткости я опишу процесс следующим образом.
Сервер работает с кодом:
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
//
IDictionary myDictionary = new Hashtable();
myDictionary["name"] = String.Format("PracticonChannel_{0}", Port);
myDictionary["typeFilterLevel"] = TypeFilterLevel.Full;
myDictionary["port"] = Port.ToString();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
http = new HttpChannel(myDictionary, clientProvider, serverProvider);
// Register RemotingShared.SingletonObject as a
// Singleton Server-Activated type.
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Practicon.RemotingShared.UploadObjectSingleton), // Server-activated type
"SingletonService", // objectUri
WellKnownObjectMode.Singleton // Singleton instancing mode
);
RemotingConfiguration.ApplicationName = " Upload Server";
RemotingConfiguration.RegisterActivatedServiceType(
typeof(Practicon.RemotingShared.UploadObjectSingleton));
Клиенты получают активированный синглтон сервером:
HttpChannel http1;
// Set the formatters of the messages for delivery.
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
//
IDictionary myDictionary = new Hashtable();
myDictionary["name"] = String.Format("PracticonChannel_{0}", Port);
myDictionary["typeFilterLevel"] = TypeFilterLevel.Full;
myDictionary["port"] = port.ToString();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;
http1 = new HttpChannel(myDictionary, clientProvider, serverProvider);
ChannelServices.RegisterChannel(http1, false);
uploadObj= (UploadObjectSingleton)Activator.GetObject(
typeof(UploadObjectSingleton),
fullAddress);
//---------- Here's the problem...
uploadObj.ReplyEvent += new UploadObjectReplyEventHandler(OnUploadReply);
OnUploadReply - это событие, реализованное в форме, которое обновляет различные элементы управления. Когда это назначается во время выполнения, исключения сериализации возникают в результате отсутствия атрибута сериализации в основной форме.
Это сводит меня с ума. Может ли кто-нибудь показать / объяснить / рассказать / проповедовать / прочитать мне лекцию о том, как я обновляю пользовательский интерфейс в ответ на события, запускаемые в синглтоне?