2013-01-13 67 views
2

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

  • 数据
  • DAL
  • 服务(使用WCF)
  • ClientWeb1(CW1)
  • ClientWeb2(CW2)

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

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

我还需要为cw1的控制器发送一个额外的消息到我的服务层,以便cw2客户端也学习cw1的更新。在这一点上,我希望我的服务层能够调用cw2的集线器,并根据cw1的初始消息向所有cw2的客户端发出消息。

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

回答

2

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

摆脱WCF服务。

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

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

<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,但这似乎很好地工作。

1

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

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

1

不知道如何用SignalR来完成它,但XSockets.NET很容易实现。

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

的链接是连接到服务器的WebSocket的WCF,但你可以下载该项目... It's都在那里。

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

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

问候 Uffe