c#Windows服务的客户端/服务器(服务)通信

时间:2011-01-03 22:21:07

标签: .net wcf windows-services

我有一个Windows服务,我正在写作。我本身没有服务问题,但这是我需要与客户端进行一些临时通信的第一项服务(其他服务刚刚通过.config文件静态配置)。我需要有一个客户端与服务通话并发送消息并获得回复。

在第一次刷新时我想到了WCF,但我似乎无法解决如何让我的Windows服务和WCF 互相交谈。我可以让Windows服务主机使用WCF服务,但这与获取实例不同,所以我可以说,连接一个事件。我也没有看到获取WCF服务的方法来获取正在运行的Windows服务的实例,因此可以与Windows服务进行通信。

要么我缺少某些东西,要么我需要有人告诉我,我不能“从这里到达那里”。如果无法完成,我想我将采用“低级”Socket调用,服务直接处理通信 - 我只是希望避免这样做。

提前致谢,
吉姆

编辑:抱歉,我对此并不清楚。我理解如何让客户端应用程序与WCF通信。我试图弄清楚如何让WCF托管服务与Windows服务对话,反之亦然。这是相同的二进制文件,我希望这样做是为客户端提供一种与服务进行通信的方式(服务到服务,而不是客户服务)。

1 个答案:

答案 0 :(得分:3)

您可以通过在Windows服务中托管WCF服务来实现此目的。然后,客户端可以对WCF服务进行Web服务调用,然后可以根据需要调用Windows服务。

以下步骤假设您希望将WCF服务保留在单独的项目中 - 这比将两个组件保留在Windows服务项目中要困难一些,但可能会使代码更有条理。

  1. 从两个项目开始 - WcfService1和WindowsService1。创建一个名为MyServiceWorker的类,它执行Windows服务的工作。
  2. 将WindowsService1中的引用添加到WcfService1。
  3. 在WcfService1中定义名为IMyServiceWorker的接口。这应该定义worker类的操作,并且应该由WindowsService1中的MyServiceWorker实现。
  4. 在WcfService1.Service1中,添加“public static IMyServiceWorker myServiceWorker”。
  5. 在WindowsService OnStart()方法中,创建一个MyServiceWorker,并将其传递给WcfService1.Service1.myServiceWorker。
  6. 打开/启动MyServiceWorker,然后打开WcfService。
  7. 以下是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();
            }
        }