Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用scaleout服务器保存信号器连接状态_C#_Asp.net_Signalr_Signalr Hub_Signalr Backplane - Fatal编程技术网

C# 使用scaleout服务器保存信号器连接状态

C# 使用scaleout服务器保存信号器连接状态,c#,asp.net,signalr,signalr-hub,signalr-backplane,C#,Asp.net,Signalr,Signalr Hub,Signalr Backplane,使用Signalr2.2.0,我希望对有关在多服务器扩展设置中执行集线器方法的客户端的观察结果进行一些验证 我让Signaler在多服务器模型中运行,使用SQL server scaleout消息总线 当客户端连接时,会按预期调用集线器的OnConnected方法。我将Context.ConnectionId保存在静态字典中 当客户端稍后调用hub的方法时,服务器场中的另一台服务器似乎正在执行hub方法,而不是最初运行OnConnected方法的服务器。hub方法中的Context.Connec

使用Signalr2.2.0,我希望对有关在多服务器扩展设置中执行集线器方法的客户端的观察结果进行一些验证

我让Signaler在多服务器模型中运行,使用SQL server scaleout消息总线

当客户端连接时,会按预期调用集线器的
OnConnected
方法。我将
Context.ConnectionId
保存在静态字典中

当客户端稍后调用hub的方法时,服务器场中的另一台服务器似乎正在执行hub方法,而不是最初运行OnConnected方法的服务器。hub方法中的
Context.ConnectionId
值正确,但字典中不存在该值

这是扩展模型中的预期行为吗?如果是这样,那么我假设我应该将连接状态数据保存在数据库中,以便所有服务器上的所有集线器都能够基于ConnectionId查找连接状态

这是扩展模型中的预期行为吗?如果是,那么我 假设我应该在数据库中保存连接状态数据,以便 所有服务器上的所有集线器都将能够查找连接 基于ConnectionId的状态

是的,这是预期的行为,您应该使用共享资源,如数据库或缓存。但仅仅连接ID本身是不够的。因为客户端将在不同的服务器上或刷新时获得不同的连接ID。所以您应该映射connectionId和客户端。当发生断开连接时,找到具有connectionId的客户端,并检查此客户端是否具有另一个connectionId


在中,我根据问题回答了更多细节。

一般来说,在共享数据库中存储共享信息是扩展模型的一种方式。但是我不明白为什么需要存储连接状态,Signal中的服务器应该只关心它的
本地
状态,这些信息不需要共享。我们所需要的只是一个在服务器之间传输消息的背板。您是否有任何需要共享此信息的特定要求?假设我们有3个用户(1,2,3)连接到服务器1,3个用户(4,5,6)连接到服务器2。当用户4向用户1发送消息时,该消息来自用户4=>Server2=>backplane=>Server1=>User1。如果用户1连接到两台服务器(在不同的设备上),这也会起作用。在这种情况下,服务器1和服务器2都会使用代表不同设备或不同浏览器选项卡的不同连接ID响应用户1,……而不会出现任何问题。