我有一个Windows服务,我正在写作。我本身没有服务问题,但这是我需要与客户端进行一些临时通信的第一项服务(其他服务刚刚通过.config文件静态配置)。我需要有一个客户端与服务通话并发送消息并获得回复。
在第一次刷新时我想到了WCF,但我似乎无法解决如何让我的Windows服务和WCF 互相交谈。我可以让Windows服务主机使用WCF服务,但这与获取实例不同,所以我可以说,连接一个事件。我也没有看到获取WCF服务的方法来获取正在运行的Windows服务的实例,因此它可以与Windows服务进行通信。
要么我缺少某些东西,要么我需要有人告诉我,我不能“从这里到达那里”。如果无法完成,我想我将采用“低级”Socket调用,服务直接处理通信 - 我只是希望避免这样做。
提前致谢,
吉姆
编辑:抱歉,我对此并不清楚。我理解如何让客户端应用程序与WCF通信。我试图弄清楚如何让WCF托管服务与Windows服务对话,反之亦然。这是相同的二进制文件,我希望这样做是为客户端提供一种与服务进行通信的方式(服务到服务,而不是客户服务)。
答案 0 :(得分:3)
您可以通过在Windows服务中托管WCF服务来实现此目的。然后,客户端可以对WCF服务进行Web服务调用,然后可以根据需要调用Windows服务。
以下步骤假设您希望将WCF服务保留在单独的项目中 - 这比将两个组件保留在Windows服务项目中要困难一些,但可能会使代码更有条理。
以下是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();
}
}