我一直在使用signalR一段时间了,这是我遇到过的第一个问题。
我在域“x”处有一个客户端连接到域“y”上的中心服务器。一切都很好......但是当我尝试使用Client.Group(groupID).someMethod调用客户端方法时,从集线器域外部连接的客户端没有得到响应?但是,如果我使用Client.All.someMethod一切正常(客户端得到响应)。
在群组和跨域支持方面,我是否遗漏了一些内容?
此外,我从外部域获取与服务器中心的连接时遇到一些麻烦。在github上的示例中,不清楚头部中的引用是否应该是:
<script src="http://localhost:61215/signalr/hubs" type="text/javascript"></script>
或
<script src="/signalr/hubs" type="text/javascript"></script>
后者不起作用......
提前致谢
答案 0 :(得分:5)
您的群组问题很可能是因为当客户端重新连接时,群组不会自动重新加入。在同一域上运行时,这不是问题,因为您的客户端可能使用永远帧或服务器发送事件传输,除非底层连接存在问题,否则不会重新连接。
但是,对SignalR的跨源访问需要WebSocket或长轮询传输。考虑到您与团体有关的问题,后者可能会在您的案例中使用。 (注意:您的SignalR服务器需要在Windows 8或2012上运行.NET 4.5以支持WebSockets)。每次接收消息时,长轮询传输都必须重新连接到SignalR服务器。
要解决此问题,请执行以下操作:
namespace MySignalRApplication
{
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
GlobalHost.HubPipeline.EnableAutoRejoiningGroups();
}
}
}
通过调用GlobalHost.HubPipeline.EnableAutoRejoiningGroups()
,您允许客户在重新连接时重新加入群组。但是,从RC2开始,SignalR不会验证重新连接的客户端以前是否在他们尝试重新加入的组中。当然,一个行为良好的客户端只会尝试重新加入之前的组,但是在RC2上启用自动组重新加入允许攻击者将自己添加到任何组。对于许多应用程序而言,这不是问题,但这就是默认情况下未启用组重新加入的原因。
在SignalR的RTM版本中,默认情况下将启用自动组重新加入。客户端尝试重新加入的组列表也将由服务器签名,使其更加安全。
至于你的第二个问题:
当您加载托管在与所提供的HTML不同的域上的JavaScript时,脚本src必须包含绝对URL。
<script src="/signalr/hubs" type="text/javascript"></script>
上面包含相对URL,这就是它不起作用的原因。