Связь клиент / сервер (служба) для AC # Windows Service - PullRequest
1 голос
/ 04 января 2011

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

При первом сбрасывании я подумал о WCF, но не могу решить, как заставить мою службу Windows и WCF разговаривают друг с другом .Я могу сделать так, чтобы служба Windows размещала службу WCF, но это не то же самое, что получить экземпляр, чтобы я мог сказать, подключить событие.Я также не вижу способа заставить службу WCF получить экземпляр работающей службы Windows, чтобы it мог общаться со службой Windows.

Либо я что-то упустил, либоМне нужен кто-то, кто скажет мне, что я не могу "добраться отсюда".Если это не может быть сделано, я полагаю, что прибегну к «низкоуровневым» вызовам Socket, когда служба обрабатывает сообщения напрямую - я просто надеялся избежать этого.

Заранее спасибо,
Джим

РЕДАКТИРОВАТЬ: Извините, я не прояснил это.Я понимаю, как заставить клиентское приложение общаться с WCF.Я пытаюсь выяснить, как заставить размещенную службу WCF общаться со службой Windows или наоборот.Это находится в том же двоичном файле, и я собираюсь сделать это, чтобы предоставить клиенту возможность общаться со службой (служба к службе, а не клиент к службе).

1 Ответ

3 голосов
/ 10 января 2011

Этого можно добиться, разместив Службу WCF в Службе Windows. Затем клиент может выполнять вызовы веб-службы для службы WCF, которая затем может выполнять вызовы в службу Windows по мере необходимости.

В следующих шагах предполагается, что вы хотите сохранить службу WCF в отдельном проекте - это немного сложнее, чем сохранить оба компонента в проекте службы Windows, но может сделать код немного более организованным.

  1. Начните с двух проектов - WcfService1 и WindowsService1. Создайте класс с именем MyServiceWorker, который выполняет работу службы Windows.
  2. Добавить ссылку в WindowsService1 на WcfService1.
  3. Определить интерфейс с именем IMyServiceWorker в WcfService1. Это должно определять операции с рабочим классом и должно быть реализовано MyServiceWorker в WindowsService1.
  4. В WcfService1.Service1 добавьте «public static IMyServiceWorker myServiceWorker».
  5. В методе WindowsService OnStart () создайте MyServiceWorker и передайте его WcfService1.Service1.myServiceWorker.
  6. Откройте / запустите MyServiceWorker, затем откройте WcfService.

Вот ключевые биты кода для WcfService:

    public interface IMyServiceWorker
    {
       void ejectCD();
       void volumeUp();
       void volumeDown();
    }

    public class Service1 : IService1
    {
        //this is the reference to your Windows Service.
        public static IMyServiceWorker WindowsServiceWorker;

        public void ejectCD()
        {
            WindowsServiceWorker.ejectCD();
        }

        public void volumeUp()
        {
            WindowsServiceWorker.volumeUp();
        }

        public void volumeDown()
        {
            WindowsServiceWorker.volumeDown();
        }
    }

А вот код для WindowsService:

  public class MyServiceWorker:IMyServiceWorker
    {
        //You will need to implement these methods.

        public void ejectCD()
        {
            throw new NotImplementedException();
        }

        public void volumeUp()
        {
            throw new NotImplementedException();
        }

        public void volumeDown()
        {
            throw new NotImplementedException();
        }

        internal void Open()
        {
            throw new NotImplementedException();
        }
    }
...