如何通过 WCF 与 Windows 服务通信?

How to communicate to Windows Service through WCF?

我有 Windows 服务,它是 运行ning 定时任务。我还选择通过 WCF 命名管道通道与 Windows 服务通信。我可以创建 WCF 服务实例并打开它进行侦听。但是我如何通过 WCF 访问依赖于 Windows 服务的对象?

这是我的 Windows 服务的样子:

public partial class MyService : ServiceBase
{
    private ServiceHost m_svcHost = null;  
    private myObject = null;

    ...

    // Run this method from external WCF client
    private void SomeMethod()
    {
    }

    protected override void OnStart(string[] args)
    {
        if (m_svcHost != null) m_svcHost.Close();

        m_svcHost = new ServiceHost(typeof(MyCommunicationService));
        m_svcHost.Open();

        // initialize and work with myObject
    }

    protected override void OnStop()
    {
        if (m_svcHost != null)
        {
            m_svcHost.Close();
            m_svcHost = null;
        }
    }
}

所以我想要的是在客户端进行查询时访问 WCF 服务中的 myObject。甚至 运行 myObject 上的一个方法。

您可以简单地使用静态 属性:

MyService(WCF 托管实体)和 MyCommunicationService(WCF 服务实例)之间创建一个通信通道
//This can be put into a separate DLL if needed.
public interface IMyHostCallbacks
{
    void HostCallback(string iSomeDataFromWCFToHost);
}

public static class Host
{
    public static IMyHostCallbacks Current;
}

public partial class MyService : ServiceBase, IMyHostCallbacks
{
    protected override void OnStart(string[] args)
    {
        //Set the static callback reference.
        Host.Current = this;

        if (m_svcHost != null) m_svcHost.Close();

        m_svcHost = new ServiceHost(typeof(MyCommunicationService));
        m_svcHost.Open();

        // initialize and work with myObject
    }

    //Here you have data from WCF and myObject available.
    void IMyHostCallbacks.HostCallback(string iSomeDataFromWCFToHost)
    {
        //Be careful here. 
        //Depending on your WCF service and WCF clients this might 
        //get called simultaneously from different threads.
        lock(myObject)
        {
            myObject.DoSomething(iSomeDataFromWCFToHost);
        }
    }
}

当然,您甚至可以将静态字段放入 MyService class,但至少 MyServiceMyCommunicationService 之间的一些抽象不会造成伤害。


现在,在您 MyCommunicationService 的任何地方,您都可以:

void WCFServiceMethod()
{
    Host.Current.HostCallback("some data");
}