我正在使用 WCF 回调在公司 LAN 内实现警报类型系统。它有一个订阅机制等。我以本教程为起点,但我将绑定更改为 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的理解有关。
谢谢