.NET Remoting - Как Сервер может обновить клиента? - PullRequest
1 голос
/ 31 января 2009

Прямо сейчас я нахожусь в стадии прототипирования. Так что я только начинаю.

Положение: Сервер - будет запускать тесты и публиковать информацию о прогрессе на клиенте, должен иметь низкий уровень воздействия, не иметь веб-сервера, возможно, работает встроенный xp или xp home.

Клиент - Инициируйте тесты и получите отчет о проделанной работе. работает xp pro.

Две машины подключены через Ethernet. Я хотел бы использовать удаленное взаимодействие .NET для связи между двумя компьютерами, и я хотел бы использовать события для обновления клиента новыми результатами с сервера, но я читал, что события ненадежны в этих условиях. Как мне это сделать? Может ли сервер подключиться к клиенту и использовать удаленное взаимодействие для публикации событий? Будет ли это работать хорошо?

Ответы [ 3 ]

3 голосов
/ 31 января 2009

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

Чтобы сделать это возможным, вы должны установить typeFilterLevel на полную, а также создать промежуточный объект, известный на клиенте и на сервере, чтобы иметь возможность обрабатывать ваши события .

Например: Этот класс известен на сервере и на стороне клиента.

public abstract class MyDelegateObject : MarshalByRefObject
{
   public void EventHandlerCallback( object sender, EventArgs e )
   {
      EventHandlerCallbackCore(sender, e);
   }

   protected abstract void EventHandlerCallbackCore(object sender, EventArgs e );

   public override object InitializeLifetimeService() { return null; }
}

На стороне клиента вы создаете другой класс, который наследуется от вышеуказанного класса и реализует фактическую логику, которая должна выполняться при возникновении события.

public class MyConcreteHandler : MyDelegateObject
{
   protected override EventHandlerCallbackCore(object sender, EventArgs e)
   {
       // do some stuff
   }
}

Вы просто присоединяете обработчик событий к событию удаленного объекта следующим образом:

MyConcreteHandler handler = new MyConcreteHandler();
myRemoteObject.MyEventOccured += new EventHandler(handler.EventHandlerCallback);

Конечно, если вы обновляете элементы управления Winform в своем классе EventHandler, этот класс также должен реализовывать ISynchronizeInvoke.

3 голосов
/ 31 января 2009

Поскольку вы все еще находитесь на стадии создания прототипа, вы можете рассмотреть возможность использования Windows Communication Foundation (WCF), а не удаленного взаимодействия. WCF имеет встроенную поддержку сценариев публикации-подписки и уже содержит все функции удаленного взаимодействия и веб-служб .NET (насколько я понимаю).

0 голосов
/ 31 января 2009

Когда сервер подключается к клиенту, вы фактически инвертируете модель и заставляете сервер становиться клиентом, и наоборот.

Вам лучше, чтобы клиент инициировал тесты и опросил сервер на предмет обновлений статуса.

Ваш выбор удаленного взаимодействия на самом деле не имеет большого значения (и не влияет на мнение, которое я предложил), но вы можете изучить его замену (WCF) вместо того, чтобы тратить время на «замененную, но все еще поддерживаемую» технологию.

...