在针对特定组跨域时未调用SignalR JS客户端方法。

时间:2013-02-12 16:41:24

标签: cross-domain signalr

我一直在使用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>

后者不起作用......

提前致谢

1 个答案:

答案 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,这就是它不起作用的原因。