WCF 在服务器上的服务之间进行通信

Posted

技术标签:

【中文标题】WCF 在服务器上的服务之间进行通信【英文标题】:WCF communicating between services on a server 【发布时间】:2011-01-10 02:46:27 【问题描述】:

我正在使用 WCF 回调在我的公司 LAN 中实现警报类型系统。它具有订阅机制等。我使用this 教程作为起点,但我将绑定更改为 NetTcpBinding 而不是 wsDualHttpBinding,并且我在 Windows 服务中自行托管。

效果很好,但我有一个问题。我的大多数客户不需要回调。它们是各种桌面应用程序,只需向服务器发送单向警报,该警报将传递给运行启用回调的“通知”应用程序并订阅该类型警报的客户端。

我可能在这里什么都不关心,但是由于我的 WCF 服务实现了回调,所有客户端都需要实现一个回调对象,无论他们是否需要回调。如果客户端与不执行回调的服务进行通信的一种方式,这似乎是一个更整洁的解决方案。

所以...我在 WCF 服务中创建了另一个没有回调的端点。它只有一个简单的单向方法调用。那行得通,但我的问题是我不太清楚如何将收到的消息传递给启用回调的服务。

我的 Windows 服务有这样的东西:

        internal static ServiceHost myNotifyHost;
    internal static ServiceHost mySendingHost;

    protected override void OnStart(string[] args)
    
        // service with callback
        myNotifyHost = new ServiceHost(typeof(NotifyService));
        myNotifyHost.Open();

        // service without callback
        mySendingHost = new ServiceHost(typeof(SendingService));
        mySendingHost.Open();
    

在 sendonly 客户端调用的 SendingService 方法中,我认为我可以做到这一点:

    var notify = (NotifyService)WindowsService.myNotifyHost.SingletonInstance;

    notify.SendMessage("Message text");

SendMessage() 将回调消息发送给订阅的客户端。不幸的是,即使有客户端连接并等待回调,myNotifyHost.SingletonInstance 也始终为空。我想我误解了该属性的含义。 NortifyService 有这些属性

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]

有没有一种方法可以在这两个服务之间进行通信?我是否应该放弃这一点,只坚持一项服务,并在那些不需要它的客户端中实现无意义的回调类。在这一点上,这没什么大不了的。更多的是与我对WCF的理解有关。

谢谢

【问题讨论】:

【参考方案1】:

试试这个,

  public class NotifyService
    
        public static NotifyService DefaultInstace;

        public NotifyService()
        
            DefaultInstace = this;


        
     ///.....SNIP......      
   

【讨论】:

谢谢。这工作得很好。实际上我之前就想到了这一点,但不知何故我从未尝试过,因为我有一些奇怪的想法,即您无法在构造函数中访问“this”。

以上是关于WCF 在服务器上的服务之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WCF 在 Windows 服务和 Windows 窗体之间进行通信?

微服务之间的 Service Fabric wcf 通信

Silverlight 客户端和 WCF 服务之间的间歇性通信问题

WCF 服务、WCF RIA 服务和 WCF 数据服务之间的区别

使用 WCF 通过 Windows 服务和 Windows 窗体应用程序进行通信

WCF 服务如何成为通信渠道?