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 窗体之间进行通信?
Silverlight 客户端和 WCF 服务之间的间歇性通信问题
WCF 服务、WCF RIA 服务和 WCF 数据服务之间的区别