Обновление графического интерфейса во время удаленного взаимодействия с событиями

Я пытаюсь осмыслить удаленное взаимодействие .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 - это событие, реализованное в форме, которое обновляет различные элементы управления. Когда это назначается во время выполнения, исключения сериализации возникают в результате отсутствия атрибута сериализации в основной форме.

Это сводит меня с ума. Может ли кто-нибудь показать / объяснить / рассказать / проповедовать / прочитать мне лекцию о том, как я обновляю пользовательский интерфейс в ответ на события, запускаемые в синглтоне?


person Muckers Mate    schedule 08.11.2013    source источник
comment
Почему бы не использовать новый WCF вместо удаленного взаимодействия?   -  person paparazzo    schedule 08.11.2013
comment
Поскольку вы используете WPF, я бы посоветовал вам реализовать шаблон MVVM, не обновляя пользовательский интерфейс, реализуя обработчики событий в вашем окне.   -  person HasaniH    schedule 08.11.2013
comment
Причина, по которой я использовал удаленное взаимодействие (насколько я понял), была наиболее близка к ActiveX EXE. Интерфейс, который захватывает синглтон и затем просит его обработать данные, должен быть доступен через com, чтобы его можно было использовать в существующем приложении VB6. Я не знаю, можно ли этого добиться в WCF.   -  person Muckers Mate    schedule 08.11.2013
comment
По сути, то, что я ищу, - это решение .NET / эквивалент для ActiveX EXE. Приложение с одним экземпляром, которое вместе со своим собственным графическим интерфейсом предоставляет функциональные возможности COM, которые можно использовать в приложении VB6 с поздним связыванием.   -  person Muckers Mate    schedule 08.11.2013
comment
Вам не нужно отвечать, но вы указываете, что клиенты размещены в приложении WPF, поэтому вы можете уточнить это.   -  person paparazzo    schedule 08.11.2013
comment
Сервер также действует как клиент. Хотя на нем размещаются активированные сервером объекты, он также может запрашивать сам синглтон. Клиенты - это простые приложения WPF - в основном для целей тестирования (я ненавижу писать код VB) - и они получают доступ к синглтону с помощью тех же средств, которые использовались бы при позднем связывании приложения VB6.   -  person Muckers Mate    schedule 08.11.2013


Ответы (1)


Хорошо, ответ на этот вопрос - использовать WCF. Это не так страшно, как кажется, и мое решение работает лучше, чем я ожидал.

Я бы хотел подчеркнуть, что кто-то пытается сделать то, с чем я столкнулся:

  1. Очевидно, создайте серверное приложение для размещения И ТОЛЬКО РАЗМЕЩЕНИЯ службы. Я пробовал делать необычные вещи, такие как использование серверного приложения для поддержки пользовательского интерфейса службы - статус, что она делает и для кого / для кого. НЕ !. Просто не надо.

  2. Поддерживайте соединение между клиентом и сервером открытым ТОЛЬКО столько времени, сколько необходимо. Если дольше, канал рискует выйти из строя, и после многих часов попыток разобраться в этом, попыток восстановиться после сбоя, вам лучше попытаться написать инструкции о том, как пасти кошек. Переосмыслить свою проблему. Открыть, использовать, закрыть.

  3. В любом случае, мне пришлось придумать замену элементу ActiveX с пользовательским интерфейсом. Я создал 3 проекта - Сервер (для хостинга), клиент (для предоставления пользовательского интерфейса для службы) и COM-интерфейс, который взаимодействует со службой (называемые функциями, набором свойств и т. Д.) И внешнее приложение.

Первое, что должен был сделать интерфейс COM, - это попытаться найти работающий экземпляр сервера (кстати, реализация единственного экземпляра приложения WPF отнюдь не легкая задача, но это не по теме)

Если его не удалось найти, он запускал серверное приложение, ждал, а затем открывал канал. Этот процесс повторялся каждый раз, когда COM-интерфейс должен был говорить / ждать интерфейса (очевидно, серверное приложение нужно было запускать только один раз). Боль в ягодицах, но это позволило избежать страшного синдрома «канал в неисправном состоянии». Раньше я обнаруживал, что услуга может быть размещена, а канал оставаться открытым в течение ПОЛНОСТЬЮ случайного количества времени - 1 минута, час, день, но ошибка будет происходить, даже если клиент / сервер ничего не делает. Поскольку моя служба контролирует производственную линию в Северной Америке (из Великобритании), и если интерфейс выходит из строя, НИЧЕГО не создается, пока он снова не заработает, моим приоритетом была стабильность. Итак, слова «рок» и «жесткий» безумно приходят на ум

Итак, повторять, открывать, использовать, закрывать.

Надеюсь это поможет.

MM

Кстати, я поддержал предложение Блама.

person Muckers Mate    schedule 19.12.2013
comment
Макерс, у меня такая же проблема. Можете ли вы помочь мне разобраться с течением такого проекта? Пожалуйста - person Nitesh Kothari; 15.02.2015
comment
Я хочу запустить WPF EXE с графическим интерфейсом пользователя на моем сервере через вызов веб-службы с использованием метода Process. @Mucker - person Nitesh Kothari; 15.02.2015
comment
Как использовать WCF и запустить графический интерфейс этого WPF? Служба WCF и веб-служба размещаются на локальном уровне. Спасибо @Muckers - person Nitesh Kothari; 15.02.2015
comment
@Nitesh Kothari - извините за задержку с ответом; какая именно помощь вам нужна? - person Muckers Mate; 21.02.2015