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

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

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

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

提前致谢,
吉姆

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

【问题讨论】:

    标签: .net wcf windows-services


    【解决方案1】:

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

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

    1. 从两个项目开始 - WcfService1 和 WindowsService1。创建一个名为 MyServiceWorker 的类,该类执行 Windows 服务的工作。
    2. 在 WindowsService1 中添加对 WcfService1 的引用。
    3. 在 WcfService1 中定义一个名为 IMyServiceWorker 的接口。这应该定义工作类上的操作,并且应该由 WindowsService1 中的 MyServiceWorker 实现。
    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();
            }
        }
    

    【讨论】:

    • 效果很好。感谢您花时间帮助我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2011-09-05
    • 2012-03-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多