我正在使用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也始终为null。我想我误解了这个属性意味着什么。 NortifyService具有这些属性
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
有没有办法可以在两种服务之间进行通信?我应该放弃这个,只是坚持一个服务,只是在那些不需要它的客户端实现无意义的回调类。在这一点上,这不是什么大不了的事。这与我对WCF的理解有关。
由于
答案 0 :(得分:1)
试试这个,
public class NotifyService
{
public static NotifyService DefaultInstace;
public NotifyService()
{
DefaultInstace = this;
}
///.....SNIP......
}