您对组的问题可能是由于客户端重新连接时组不会自动重新加入。在同一个域上运行时这不是问题,因为您的客户端可能使用永远帧或服务器发送事件传输,除非底层连接出现问题,否则不会重新连接。
但是,对 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,这就是它不起作用的原因。