2

关于 SignalR 跨域的问题。我的 .NET 应用程序中有以下层:

  • 数据
  • 达尔
  • 服务(使用 WCF)
  • 客户端Web1 (cw1)
  • 客户端Web2 (cw2)

服务层的原因是充当 cw1 / cw2 上的 SignalR 集线器之间的中间人。

目标是 cw1 将向其控制器发送某种更新消息,然后更新 cw1 的集线器,然后将其广播到所有 cw1(标准信号器功能)。

我还需要让 cw1 的控制器向我的服务层发送一条附加消息,以便 cw2 客户端也从 cw1 获悉更新。在这一点上,我希望我的服务层能够调用 cw2 的集线器并根据 cw1 的初始消息向所有 cw2 的客户端发送消息。

所以我的问题是:如何从外部服务层访问 cw1 或 cw2 的集线器?这可能吗?我相信这是但似乎无法找到最佳答案,因为有许多已弃用的 SignalR 功能。

4

3 回答 3

2

据我所知,这是不可能的。为了能够与集线器通信,您需要通过其公共 API 向其发送消息,或者您需要另一个私有 API(在您的情况下为 WCF 服务),它位于同一 ASP.NET 实例中的集线器旁边,可以广播消息本身使用GlobalHost.ConnectionManager.GetHubContext<MyHub>(),或者,为了更清晰的关注点分离,使用一些共享的内部接口,将 WCF 服务与“SignalRness”完全分离。

我建议使用后一种单独服务的方法,因为除了更好地分离关注点之外,通过公共 API 发送消息意味着连接到集线器的任何人都可以发送相同的消息,如果他们弄清楚它们是什么. 要么,要么您需要为这些特定的集线器方法引入/使用不同级别的安全检查,以确保只有某些调用者有权调用它们。

于 2013-01-15T18:48:47.253 回答
2

谢谢你的回答。我最终通过执行以下步骤解决了这个问题:

摆脱 WCF 服务。

在虚拟目录上设置另一个 Web 项目,这将是我保存集线器的地方。

然后我通过更改客户端脚本引用将我的 SignalR 客户端从其他 2 个 Web 项目指向此,例如

<script src="Scripts/jquery-1.6.2.min.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR.min.js" type="text/javascript"></script>
<script src="http://localhost/MyThirdVirtualDirWebProj/signalr/hubs" type="text/javascript"></script>

然后我可以向/从我的第三个“中间人”项目的中心发送消息。可能有更好的方法来做到这一点,也许使用上面提到的 XSockets,但这似乎工作得相当好。

于 2013-01-19T19:53:42.287 回答
1

不知道如何使用 SignalR,但使用 XSockets.NET 很容易。

https://github.com/codeplanner/XSocketsWCF/blob/master/src/XSocketsWCF/XSocketsWCF/WCF/Service/RoomService.cs

该链接指向连接到 websocket 服务器的 WCF,但您可以下载该项目......它就在那里。

另一个(几个)优点是 XSockets 将提供来自 3.0 的集群服务器,以便服务器 1 上的消息将到达服务器 2(反之亦然),然后您将不需要 WCF 部分。

关于 3.0 版本:http: //xsockets.net/blog/sneak-peek-at-the-30-features

问候乌夫

于 2013-01-16T14:10:19.170 回答