2

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

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

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

我还在 nunit 单元测试中尝试了相同的代码,但它也不起作用。

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

4

2 回答 2

6

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

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

如果您需要从单独的应用程序到客户端的双向通信,那么只需将您的应用程序也变成 SignalR 客户端,并让它通过托管 SignalR 的 Web 应用程序与客户端通信,并让它也监听来自它们的消息。

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

SignalR 复杂架构

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

于 2012-04-04T16:25:57.703 回答
2

我无法准确地得到你的目标。但是,如果我理解正确,您正在尝试将 WCF 服务中引发的某种通知发送给 SignalR 客户端。如果是这样的话;我可以建议你我的方法:

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

SignalR hub 可以通过 usingSystem.Messaging.MessageQueue#ReceiveCompleted方法侦听新的队列项。引发此事件时,SignalR 集线器会获取队列项目并向其客户端广播。

于 2013-08-12T20:14:03.570 回答