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

Posted

技术标签:

【中文标题】c# Windows 服务的客户端/服务器(服务)通信【英文标题】:Client/Server (Service) Communications for a c# Windows Service 【发布时间】:2011-01-03 22:21:06 【问题描述】:

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

起初我想到了 WCF,但我似乎无法解决如何让我的 Windows 服务和 WCF相互通信。我可以让 Windows 服务托管 WCF 服务,但这与获取实例不同,所以我可以说,连接一个事件。我也看不到让 WCF 服务获取正在运行的 Windows 服务实例的方法,以便 可以与 Windows 服务对话。

要么我遗漏了什么,要么我需要有人告诉我我不能“从这里到达那里”。如果做不到,我想我会求助于服务直接处理通信的“低级”套接字调用——我只是希望避免这样做。

提前致谢, 吉姆

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

效果很好。感谢您花时间帮助我。

以上是关于c# Windows 服务的客户端/服务器(服务)通信的主要内容,如果未能解决你的问题,请参考以下文章

无法从 C# 中的客户端(控制台应用程序)从 WCF 服务(已通过 Windows 身份验证)访问 SQL Server

C# 编写WCF简单的服务端与客户端

C# Windows 应用程序从流套接字读取数据不可理解

使用 C# .Net 4.5 的高效且可扩展的连接 TCP Windows 服务

由非托管 (C++) COM 服务器实例化的托管 (C#) 控件在 Windows 更新后中断

C# 在客户端和服务器上使用 TcpListener