SignalR:如何停止在页面重新加载时创建新连接

2024-02-16

您好,我正在开发一个聊天应用程序以及应用程序中的一些其他页面。一旦我登录,我就会维护用户的会话。我的主要目的是,每当其他用户连接到服务器时,用户应该收到通知。

我面临的问题是每当我导航到应用程序中的其他页面时,连接就会丢失。如何停止此行为并继续连接直到用户注销。

我在 ASP.NET MVC4 项目中使用 SignalR 2.0,有什么帮助吗?


每个连接的生命周期仅限于用户在给定页面上花费的时间。当他们导航到另一个页面时,就会建立新的连接。此外,如果用户打开了多个选项卡或浏览器窗口,他们将拥有多个连接 ID。我认为您不想尝试在其预期生命周期之外保留连接 ID。

在我处理的类似场景中,我们在连接时存储连接 ID,并在断开连接时删除它们。当需要将消息发送给给定用户时,我们将其发送给他们的所有connectionId。这可确保消息将传递到所有选项卡/窗口。

EDIT 1以下是对@Saurabh评论的回应:

考虑中心的范围以及其他类和客户端的范围。集线器的作用是促进浏览器和服务器之间的通信。虽然可以在中心内完成大量工作,但我认为最好将通信之外的大部分范围移至其他地方。

客户端知道它刚刚重新加载了页面,因此它是做出这是重新连接事件决定的良好候选者。

_chatHub.server.reJoinRooms();

然后Hub可以通过UserId而不是ConnectionId查询用户的房间。

public Task ReJoinRooms()
{
// get the user's rooms from your repository
// optionally get the user's connectionIds from your repository
// Clients.Caller.onJoinRooms(rooms);
// or Clients.Clients(_connectionIds).onJoinRooms(rooms);
}

然后客户端可以决定是否采取行动:

$chatModule.client.onJoinRooms = function (rooms) {
   for (var i in rooms) {
           var _room = rooms[i];
           // if I'm not already in this room, add it to my rooms
           console.log('joining room', _room)
       }
}

你可以用很多不同的方式来剥皮。客户端也可以拥有记忆室的范围,而不是服务器端存储库。

EDIT 2

如果用户所属的组/房间的数量不断增加,则上面的示例可能无法很好地扩展。

在这种情况下,每个用户都可以加入个人提要(即加入以用户的 GUID 命名的提要)。我们将跟踪隶属于某个组的每个用户。当消息发送到该组时,我们将迭代这些用户并向每个提要发布消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SignalR:如何停止在页面重新加载时创建新连接 的相关文章

随机推荐

  • CMake 中的绝对路径与相对路径

    我一直在尝试构建一个简单的 C 库 在使用相对路径构建的过程中 CMake 无法正确配置我的链接库所在的位置 使用绝对路径配置成功 这是让我放弃使用 CMake 的一些原因之一 设置路径的推荐方法是什么 是绝对路径还是相对路径 为什么 gi
  • 如何在 Delphi 中递归创建文件夹?

    在创建可以通过给定路径递归创建文件夹的函数时需要一些帮助 C TestFolder Another AndAnother Delphi 函数 MkDir 返回 IOerror 3 MkDir C TestFolder Another And
  • 将证书从驱动程序导入 TrustedPublisher 以进行静默驱动程序安装

    我想安装 Balloon 驱动程序以在 KVM 中运行 Windows 无需用户任何交互 静默安装 我使用 powershell 将驱动程序中的证书提取到某个临时文件 然后使用 certutil exe 将其导入到 TrustedPubli
  • 在元素之间移动鼠标太快时的 jQuery 悬停问题

    我在页面上多次重复以下 html div class outer outer div class inner inner div div 并有这个 jQuery inner hide outer hover function e this
  • clang-tidy 配置中没有等效的“-line-filter”?

    我想配置我的 line filter 中的论点 clang tidy文件而不是生成命令的 cmake 源文件中 添加一个LineFilter文件的密钥只会给我一个 未知密钥 错误 这真的不支持通过配置文件吗 还有其他选择吗 不幸的是 这不受
  • 如何将 CSS 引用添加到 .NET SyndicatedFeed?

    我创建了一个包含许多 Syndicates 的简单 SyndicatedFeed 每个 SyndicateItem 都有 HtmlContent HtmlContent 是一个表 这显示正常 但现在我需要在桌子上添加最少的样式 填充 我相信
  • 将 Oracle 数据库从一台 PC 转移到另一台 PC 的最简单方法是什么?

    我想把我的oracle数据库转移到另一台电脑上 最简单的方法是什么 有没有 GUI 工具可以做到这一点 APC 的答案是逻辑传输的方法 如果您询问是因为您只想一次性传输到另一台电脑 那么 安装相同版本的Oracle 第二台电脑 创建相同的目
  • 当更改视图的模型时,是替换模型更好还是创建新视图更好?

    我的 Backbone 应用程序中有一个电子邮件视图 它目前在中实例化view我的控制器的动作 它有点像这样 routes email id email email function id var email new Email id id
  • Android 嵌入式网络服务器

    我想在我的 Android 应用程序中嵌入一个网络服务器 连接到它的设备将具有两种功能 一个是发送一个 xml 文件 我可以解析该文件并执行一些操作 另一个是能够从我的 SD 卡下载文件 我找到了 nanoHTTPD 和 AndroidHT
  • Linux 上的 mysql2 gem 安装

    我正在尝试在 Linux 上安装 gem 但它给了我一个错误 An error occured while installing mysql2 0 3 11 and Bundler cannot continue Make sure tha
  • Rails 中是否可以有复合外键?

    假设以下数据模式 Usage client id resource type amount Billing client id usage resource usage type rate 在此示例中 假设我有多个资源 每个资源都可以通过多
  • Python json.loads 改变对象的顺序

    我有一个包含 JSON 对象的文件 它是通过以下方式加载的 with open data json r as input file input data input file read 此时 input data 仅包含一个字符串 现在我继
  • Grails 3:外部 Logback.groovy 文件

    我正在尝试将我的logback groovy通过在 my 中设置路径来设置文件build gradlebootrun 闭包中的文件 bootRun if Environment currentEnvironment Environment
  • 浮动创建重叠的 Div

    我有两个 div 一个在另一个里面 当我将里面的一个浮动到 左 时遇到了一些问题 问题是外部 div 不会扩展其高度以适应内部 div 内部的文本 由于这可能非常令人困惑 因此我将尝试用一些代码来解释它 HTML div Inner Div
  • gprof 命令未创建正确的 out.txt

    首先 我运行的是 MacOSX 10 7 1 我已经正确安装了 Xcode 4 和所有库 以便使用 C 语言 我在 shell 中运行 gprof 命令时遇到问题 我将逐步解释我正在做的事情以及我收到的输出 Step 1 roger cd
  • 如何为 if 和 while 语句编写简单的解析器? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要编写一个简单的解析器 将标记转
  • 无法获取 BatchedBridge,请确保您的捆绑包正确打包

    我在 Android 中使用 React Native 时遇到问题 无法获取 BatchedBridge 请确保您的捆绑包正确打包 在此处输入图像描述 1 1 我尝试了一切 将 npm react native react 和 packag
  • Oracle Entity Framework 提供程序不存储包含毫秒的 DateTime.Now

    我基本上和这个人有完全相同的问题 为什么我无法使用实体框架保存当前的 DateTime Now https stackoverflow com questions 18557546 why i cant save the current d
  • R 中的点计数

    假设我从 40 个 x y 对创建以下图片 现在给出黑色的附加点 我希望能够计算出有多少点落在蓝色区域内 有多少点落在蓝色区域之外 以一种非常有效的方式 因为我将在一个昂贵的循环中多次执行此操作 为了说明我正在寻找的内容 请考虑下图 所以正
  • SignalR:如何停止在页面重新加载时创建新连接

    您好 我正在开发一个聊天应用程序以及应用程序中的一些其他页面 一旦我登录 我就会维护用户的会话 我的主要目的是 每当其他用户连接到服务器时 用户应该收到通知 我面临的问题是每当我导航到应用程序中的其他页面时 连接就会丢失 如何停止此行为并继