【问题标题】:How to communicate to Windows Service through WCF?如何通过 WCF 与 Windows 服务通信?
【发布时间】:2016-06-04 19:54:21
【问题描述】:

我有 Windows 服务,它在计时器滴答声中运行任务。我还选择了通过 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 上运行一个方法。

【问题讨论】:

  • 这个问题需要进一步澄清。添加显示您到目前为止进度的信息。您还试图访问哪些对象?
  • 已更新。基本上我需要控制 Windows 服务活动,通过 WCF 服务查询其状态。
  • 您只需要在MyCommunicationService 实例和您的Windows 服务实例之间建立一个命令通道。您可以通过多种方式实现这一点,例如通过静态属性。
  • 我是否正确理解我必须打开 2 个通信通道,一个用于外部客户端,一个用于 Windows 服务?那么这个MyCommunicationService 将仅充当代理,对吗?这是 WCF 的常见模式吗?
  • @Pablo 不,我并不是说您的 WCF 服务和它的主机之间需要额外的通信通道。您可以通过一个简单的静态属性实现这种通信,而无需任何抽象。

标签: c# wcf windows-services


【解决方案1】:

您可以简单地使用静态属性在您的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 类中,但至少 MyServiceMyCommunicationService 之间的一些抽象不会受到伤害。


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

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

【讨论】:

  • 我明白了。基本上它是带有控制器对象的单例模式。如果没有其他方法,我很快就会接受这个答案。
  • @Pablo 是的,但不要把单例项搞砸。这里是单一的 Windows 服务实例。 WCF 服务可以有很多实例。只要默认情况下 Windows 服务是单例的并且这是获得它的唯一方法,您就不会将其称为单例。我不太明白你在这里对控制器对象的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
相关资源
最近更新 更多