2011-01-03 3 views
1

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

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

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

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

EDIT: К сожалению, я не был понятнее на этом. Я понимаю, как заставить клиентское приложение разговаривать с WCF. Я пытаюсь выяснить, как заставить службу WCF размещаться в службе Windows или наоборот. Это находится в том же двоичном формате, и я хочу сделать это, чтобы предоставить клиенту возможность поговорить с сервисом (услуга для обслуживания, а не клиент для обслуживания).

ответ

3

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

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

  1. Начните с двух проектов - WcfService1 и WindowsService1. Создайте класс с именем MyServiceWorker, который выполняет работу службы Windows.
  2. Добавить ссылку в WindowsService1 в WcfService1.
  3. Определите интерфейс с именем IMyServiceWorker в WcfService1. Это должно определять операции над рабочим классом и должно выполняться MyServiceWorker в WindowsService1.
  4. В WcfService1.Service1 добавьте «общедоступный статический 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(); 
     } 
    } 
+0

Он отлично работает. Спасибо за ваше время, помогая мне в этом. – Jim