Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Signalr 在外部数据存储中管理连接的信号器_Signalr_Signalr Hub_Signalr.client_Signalr Backplane - Fatal编程技术网

Signalr 在外部数据存储中管理连接的信号器

Signalr 在外部数据存储中管理连接的信号器,signalr,signalr-hub,signalr.client,signalr-backplane,Signalr,Signalr Hub,Signalr.client,Signalr Backplane,我们正在寻找一种方法,通过后台进程将消息推送到连接的客户端 我们正在采取的方法是,每当建立新连接(OnConnected)时,我们将connectionId单独存储在mongo db中,其中包含一些请求元数据(用于以后的过滤)。当事件发生时(从客户端或后端进程触发),workerrole(另一个后台进程)将侦听这些事件(通过消息传递或其他方式),然后根据事件详细信息,使用捕获的元数据过滤连接的客户端 这种方法似乎还可以,但我们遇到了一个问题 信号服务器关闭 在服务器进行备份之前,客户端会断开连接

我们正在寻找一种方法,通过后台进程将消息推送到连接的客户端

我们正在采取的方法是,每当建立新连接(OnConnected)时,我们将connectionId单独存储在mongo db中,其中包含一些请求元数据(用于以后的过滤)。当事件发生时(从客户端或后端进程触发),workerrole(另一个后台进程)将侦听这些事件(通过消息传递或其他方式),然后根据事件详细信息,使用捕获的元数据过滤连接的客户端

这种方法似乎还可以,但我们遇到了一个问题

  • 信号服务器关闭
  • 在服务器进行备份之前,客户端会断开连接(关闭浏览器或其他)
  • 信号服务器返回

  • 我们在mongodb中留下了连接,我们不知道它们的连接状态

  • 我想知道是否有更好的方法来做到这一点,目标是能够针对特定的连接客户端从后端服务(工作者角色)将消息推送到

    顺便说一句,我们在服务总线背板上使用scaleout选项

    以下指南介绍了管理连接的几种选项

    您当前采用的方法属于“永久、外部存储”选项

    如果您想/需要坚持使用该选项,可以添加某种清理过程,定期从数据库中删除已停用超过指定时间的连接。当然,当具有匹配元数据的客户端使用新的connectionId重新连接时,也可以主动删除旧条目


    我认为更好的选择是使用IUserIdProvider或(单用户?)组,前提是您的过滤要求不太复杂。使用这两个选项中的任何一个都不必在数据库中存储ConnectionID。这些选项还使得向多个设备/选项卡发送消息变得相当容易,单个用户可以同时打开这些设备/选项卡。

    您可以在服务器的应用程序启动时这样做,它为任何打开的连接指定断开日期或任何标记。这也是一个很好的选项,与保存的元数据相匹配的新客户端连接使用组的一个问题是,它们不会持久化,因此,您基本上需要管理组和组中的连接—客户端应留在组中,直到在客户端上调用stop,或者客户端完全断开与服务器的连接(即,它已停止绑定到自动重新连接)。如果要使用组解决方案,您应该有一种方法始终将同一用户添加到OnConnected中的同一组,以防您必须手动重新启动客户端。