SignalR - 从WCF项目发送消息

时间:2012-04-04 16:11:41

标签: wcf signalr

我已按照https://github.com/SignalR/SignalR/wiki/Hubs的说明进行操作 题为“从集线器外部向集线器广播”。

我在同一个项目中的MVC Action中使用了这个方法。请求操作将更新发送给已连接的客户端。

我的问题是我需要能够从另一个项目发送更新,特别是WCF Web服务项目。我的应用程序有一个API和一个Web组件,当API用户进行改变调用的调用时,需要通过SignalR将这些更新推送到Web客户端。使用与我的测试操作相同的代码调用Web服务不起作用。

我也在nunit单元测试中尝试了相同的代码,这些代码也没有用。

我需要做些什么才能使Wiki上描述的相同方法适用于WCF项目?

2 个答案:

答案 0 :(得分:6)

最简单的解决方案可能是在您的Web应用程序(使用MVC或新的WebAPI)上提供一个API,该API将广播到所有连接的客户端。任何其他应用程序(NT服务,NUnit测试......)如果想要向客户端发送消息,则可以调用该API。

如果您没有在IIS下运行的Web应用程序或直接托管它的其他应用程序中托管集线器,您就不能指望SignalR做任何事情。

如果您需要从单独的应用程序到客户端进行双向通信,那么只需将您的应用程序转换为SignalR客户端,并让它通过Web应用程序托管的SignalR与客户端进行通信,并让它同时收听来自客户端的消息。

例如,以下是我如何配置复杂的Service + WebSite + Clients解决方案(暂时忽略紫色):

SignalR Complex Architecture

Live Web Server允许NT服务连接和创建SignalR组。 NT服务发送给这些组。 Web浏览器连接到组并接收发送到该组的消息。实际上,中间的盒子变成了pubsubhub。

答案 1 :(得分:2)

我无法准确得出你的目标。但是如果我理解正确的话,你会尝试将一些WCF服务中提出的通知发送给SignalR客户端。 如果是这样的话;我可以建议你的方法:

我在同一个应用程序服务器中有一些WCF服务和一个SignalR集线器。恕我直言,与SignalR集群通信WCF的最佳方式是使用MSMQ。 当在WCF服务内发生通知时,它会将通知有效负载放入MSMQ。 另一方面,SignalR中心侦听同一队列。当消息放入队列时,它将获取内容并广播到集线器客户端。非常简单直接。服务器端没有额外的服务/集线器呼叫。

SignalR hub可以使用System.Messaging.MessageQueue#ReceiveCompleted方法侦听新的队列项。当此事件引发时,SignalR hub获取队列项并向其客户端广播。