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

1 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>
Run Code Online (Sandbox Code Playgroud)

要么

<script src="/signalr/hubs" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

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

提前致谢

hal*_*r73 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();
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

通过呼叫,GlobalHost.HubPipeline.EnableAutoRejoiningGroups()您允许客户在重新连接时重新加入群组.但是,从RC2开始,SignalR不会验证重新连接的客户端以前是否在他们尝试重新加入的组中.当然,一个行为良好的客户端只会尝试重新加入之前的组,但是在RC2上启用自动组重新加入允许攻击者将自己添加到任何组.对于许多应用程序而言,这不是问题,但这就是默认情况下未启用组重新加入的原因.

在SignalR的RTM版本中,默认情况下将启用自动组重新加入.客户端尝试重新加入的组列表也将由服务器签名,使其更安全.

至于你的第二个问题:

当您加载托管在与所提供的HTML不同的域上的JavaScript时,脚本src必须包含绝对URL.

<script src="/signalr/hubs" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

上面包含一个相对URL,这就是它不起作用的原因.