使用SignalR 2.2.0,我想对有关在多服务器扩展设置中执行集线器方法的客户端的观察进行一些验证。
我使用SQL Server scaleout消息总线在多服务器模型中运行SignalR。
当客户端连接时,将按预期调用Hub的OnConnected
方法。我将Context.ConnectionId
保存在静态字典中。
当客户端稍后调用集线器的方法时,服务器场中的另一台服务器似乎正在执行集线器方法,而不是最初运行OnConnected方法的服务器。 hub方法中的Context.ConnectionId
值是正确的,但在字典中不存在。
这是扩展模型中的预期行为吗?如果是这样,那么我假设我应该在数据库中保存连接状态数据,以便所有服务器上的所有Hub都能够根据ConnectionId查找连接状态。
答案 0 :(得分:1)
这是扩展模型中的预期行为吗?如果是的话,那么我 假设我应该在数据库中保存连接状态数据 所有服务器上的所有Hub都能够查找连接 基于ConnectionId的状态。
是的,这是预期的行为,您应该使用共享资源,如数据库或缓存。但connectionIds本身还不够。因为客户端将在不同的服务器上或刷新时获得不同的connectionIds。所以你应该映射connectionId和客户端。发生断开连接时,找到带有connectionId的客户端并检查此客户端是否有另一个connectionId。
在here我已根据问题回答了更多细节。