建立一个站点(server),提供signalR服务
建立另一个站点(client),调用signalR服务
把server配置到web farm下
client通过webfarm调用。
webfarm不支持websocket,所以退化成长连接(据说nginx好像支持了,没试过)。
当farm下只有一个节点时,一切正常,当加入2个节点后
在调用/signalr/connect或/signalr/reconnect时,有时会报错
The connection id is in the incorrect format.
这个与connection id和connection token的生成验证有关。
于此相关的接口为IProtectedData
实现此接口(源码中有测试部分,可参考)不做乱七八糟的验证,直接返回
public class EmptyProtectedData : IProtectedData { public string Protect(string data, string purpose) { return data; } public string Unprotect(string protectedValue, string purpose) { return protectedValue; } }
最后注册到依赖注入中。注意注册的位置
RouteTable.Routes.MapHubs(new Microsoft.AspNet.SignalR.HubConfiguration { EnableCrossDomain = true, EnableJavaScriptProxies = true }); GlobalHost.DependencyResolver.Register(typeof(IProtectedData), () => new EmptyProtectedData());
要在MapHubs后面。否则是不起作用的。
因为加入了负载,是两台以上的真实服务器,监听连接到A,而发送负载到B,此时要B的发送引起A的监听返回。单纯上面的配置是不行的。
还需要引入对负载的支持。
目前提供了基于azure,redis和sql server的,实验环境用的是sql server。配置很简单可参考http://www.asp.net/signalr/overview/performance-and-scaling/scaleout-with-sql-server
本实验,client和server用的是不同的站点,及2个域名,所以还要开启跨域支持
RouteTable.Routes.MapHubs(new Microsoft.AspNet.SignalR.HubConfiguration { EnableCrossDomain = true, EnableJavaScriptProxies = true });