1

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

后者没有工作......

提前致谢

4

1 回答 1

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

于 2013-02-12T19:15:19.037 回答