问题标签 [signalr-backplane]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
dependency-injection - SignalR & Autofac - Redis 背板横向扩展
我有以下情况:我有一个 SignalR 应用程序,其中我使用 Autofac 作为依赖关系解析器。
这就是AutofacContainer
课堂。
现在,来自 Microsoft 的官方 SignalR Redis 横向扩展文档声明我应该告诉GlobalHost.DependencyResolver
to UseRedis
.
由于我GlobalHost
不再在应用程序中使用(即使我使用GlobalHost
Redis 中绝对没有任何行为)(正如 Autofac 与 SignalR 和 Owin 的集成所表明的那样):
OWIN 集成中的一个常见错误是使用 GlobalHost。在 OWIN 中,您从头开始创建配置。使用 OWIN 集成时,不应在任何地方引用 GlobalHost。
由于Startup
现在已配置该类:
所以我创建了一个新resolver
的类型AutofacDependencyResolver
,它成功连接到 Redis PubSub。然而问题是,如果我尝试发送一条消息,该消息将重复数千次。
(在 Chrome 控制台中,为了从服务器发送一条消息,我最终陷入了无限循环,客户端无限次地接收它)。
所以,问题是:如何在使用 Autofac 作为依赖解析器时设置 SignalR Redis 横向扩展(注意:没有任何情况下我可以使用另一个依赖解析器)。
谢谢!
编辑:如果您想了解有关解决方案的更多信息,这里是没有此行的 repo:
谢谢!
编辑:我觉得我应该澄清一些事情:如果我使用resolver.UseRedis();
,通常会发送(一次)的每条消息都会发送多次 - 所以如果我在 Redis 中订阅“channelName”,使用subscribe "channelName"
,我发现它与客户端的行为:每条消息被多次发送。
接下来要做的是有一个没有 Autofac 的基本 SignalR 应用程序,看看 Redis 的行为,虽然我觉得这是一个 Autofac 相关的问题,更具体地说与配置有关。
谢谢!
更新:显然,没有 Autofac 的基本 SignalR 应用程序中存在相同的行为。该问题与 Autofac 无关。
sql-server - 为 Signalr 扩展 SQL Server 背板
我已经使用 SQL Server 背板实现了负载平衡的 SignalR 服务,并且工作正常。现在我想在两个 SQL Server 之间横向扩展背板,但我找不到任何特定于 SignalR 的文档来说明如何执行此操作。当您为 SignalR 设置 SQL Server 背板时,它会创建并管理它需要的所有表。
所以我的问题:
- 如何为 SignalR 配置两个 SQL Server 之间的服务代理?
- SignalR SQL Server 背板是否也管理服务代理通信?
- 这甚至可能吗?
asp.net - 使用 Redis 的 SignalR 横向扩展背板
我正在将 SignalR 与 Redis 背板横向扩展一起使用。现在,该Microsoft.AspNet.SignalR.Redis
包依赖于StackExchange.Redis.StrongName
.
因为我已经在我的应用程序中使用了 Redis,所以我已经StackExchange.Redis
安装了这个包。
当我安装Microsoft.AspNet.SignalR.Redis
并选择不将依赖项安装到 Redis 的强名称包时,我的应用程序停止工作(客户端未连接到服务器 - 它尝试每种连接方法,回退到longPolling
,但失败)。
奇怪的是,如果我安装StackExchange.Redis.StrongName
(此时我有强名称版本和普通版本 - 所以我对 Redis 的每种类型都有重复的标识符) - 我卸载了强名称包,一切都开始工作了。(即使强名称包没有任何依赖项)。
我的问题 - 强名称包是否包含 SignalR 使用的一些特定内容(以及为什么应用程序在删除它后工作?)
谢谢!
asp.net-mvc-5 - 在 SignalR 集线器中更新每个用户的统计信息
我正在使用 SignalR 2 和 MVC 5 开发一个简单的游戏。我需要跟踪每个用户的“死亡”和“杀戮”数量。这些统计数据需要从多个服务器的多个游戏实例(用户可以有多个并发会话)中读取/写入。
将字段添加到ApplicationUser : IdentityUser
合理的解决方案中吗? 我计划使用内置的身份验证系统,因为我喜欢支持 Facebook 和其他 OAuth 提供程序是多么容易。
我应该如何在优化的庄园中更新这些统计信息,以减少多用户/线程/服务器问题并具有高度可扩展性? 统计数据本身很简单,每个用户可能每隔几秒更新一次,但我想要一个可以跨多个服务器支持数百万用户的设计。
例如,我知道我可以在 MVC 控制器中添加这段代码来更新统计信息:
但是,这似乎不是很安全/交易。如果另一个进程/连接/服务器同时更新该用户,则可能会发生坏事。
在纯 SQL 设计中,我可能会有一个在 SQL 事务中运行以获取当前计数器并递增它的存储过程。不知道如何将其转换为利用各种 API 层必须提供的所有功能(OWIN、MVC、ASP.NET 等)的良好 SignalR 设计。理想情况下,如果直接 SQL 访问成为问题,我可以轻松地将 Redis 添加到未来。
signalr - 查找 SignalR 实时连接
我正在使用带有 SignalR 的 Redis 背板。我有一个问题,但我找不到任何关于此的内容。
SignalR 客户端是 Windows 窗体应用程序。
我正在使用 OnConnected 和 OnDisconnected 事件来处理用户连接。
我有一个 POCO 类,用于连接 ConnectionId 属性和其他一些信息(用户名等)。
在 OnConnected 事件中,我使用 ConnectionId 向 Redis 插入新记录,并且 OnDisconnected 事件从 Redis 中删除条目。我在 OnReconnected 事件中什么也没做。
但是现在Redis中用户名相同,connectionid不同的记录太多了。
我可以使用 ConnectionId 检查连接是否存在吗?如果可能的话,我想删除 Redis 中的死连接。
您对同样的记录问题有任何想法吗?
编辑:首先,我对 OnConnected 事件有误。我不使用 OnConnected 事件。在 SignalR 连接后,WinForms 客户端应用程序在 Hub 上触发 Join 事件。
这是 UserData POCO 类:
加盟方式:
我正在通过 Startup 将 _trackuser 对象注入到 Hub 类中
OnDisconnected 事件:
TrackUser 添加方法:
TrackUser 删除方法:
c# - 无法将消息从事件中心处理器发送到 SignalR 服务总线背板
我将 SignalR 与服务总线背板一起使用。试图从不是网络服务器的东西发起消息。(事件中心处理器)
以下代码在 C# 命令行应用程序中运行良好。
但是当添加到事件处理器代码中时,它会默默地不发送数据。我的问题是,如何将其设置为在事件中心处理器中工作。
我目前正在通过向网站发送 Web 请求来解决此问题,然后该网站会广播该消息。
谢谢。
c# - 使用 SQL 背板扩展 SignalR 并在服务器之间维护 UserList
我希望有人遇到过这个问题,或者至少可以发现我的代码有什么问题。
我使用 MVC 和 SignalR 创建了一个基于浏览器的聊天应用程序,因为我需要一个用户登录聊天我已经针对 MVC 控制器实现了一个注册,它将用户添加到内部 UserList
从客户端我实例化chatHub
然后调用Connect
所有这些在单个服务器上运行良好并且所有连接都保存在内存中,顺便说一句,这已经生产了一年多。
现在,我需要为我们的聊天应用程序建立更好的弹性,例如在负载平衡的环境中,但由于一切都在内存中,我立即遇到了用户 A 连接到服务器 X 和用户 B 连接到服务器 Y 的问题(两者都不能看到另一个,你可以看到问题)。
因此,在网上搜索了很长时间后,我发现了几篇关于使用 Redis 或 SQL 扩展 SignalR 的文章。由于我们公司使用 SQL 并且在这方面有很多经验,所以我选择了这篇文章。
我包含了 nuget 包并将我的Startup
课程修改为以下内容
我在 IIS 中在不同的端口上配置了两个网站,以模拟负载平衡环境以进行测试,例如。http://localhost:21215/和http://localhost:21216/我将称之为 SiteA 和 SiteB
当我运行每个站点时会发生以下情况:
- 使用 ?userName=TestUserA 启动 SiteA,然后使用 ?userName=TestUserB 启动 SiteB -- 结果是 SiteA 加载(最初没有联系人),然后 SiteB 加载,SiteA 用户列表使用 TestUserB 更新。SiteB 没有用户。
注意:执行与上述相反的操作会产生相同的结果。
我不知道问题出在哪里,我检查了 SQL 数据库,可以看到背板已经创建了 SQL 表并且数据正在进入它们。我也尝试使用与上述相同的问题来实现 Redis 解决方案。
有没有人实施过这个并遇到同样的问题?或者任何人都可以解释一下这个问题可能是什么?
编辑
经过进一步的诊断/测试,问题似乎与UserList
每个服务器上维护的内部有关,我相信事件的顺序如下:
UserA
登录SiteA
SiteA
增加UserA
了UserList
_SiteA
SiteA
hub.Connect(...)
从客户端执行,然后Clients.Client(...).DrawTree(...)
执行Clients.AllExcept(...).addUser(...)
- 上述调用更新
SiteA
用户列表,并通知所有连接的客户端有一个新用户 SiteA
已连接且没有活动用户UserB
登录SiteB
SiteB
增加UserB
了UserList
_SiteB
SiteB
hub.Connect(...)
从客户端执行,然后Clients.Client(...).DrawTree(...)
执行Clients.AllExcept(...).addUser(...)
- 前面的调用更新
SiteB
用户列表,并通知所有连接的客户端有一个新用户——这addUser
在SiteA
客户端上执行以添加UserB
到用户列表 SiteB
已连接且没有活动用户,而SiteA
有一个活动用户
我认为问题在于 SQL 背板只会在消息发送时处理它们,并且已经从 SQL 数据库中表的命名约定中确认了这一点。然而,内部UserList
负载平衡服务器之间不同步。SiteA
更新的事实UserB
仅是由于连接addUser
时的广播(意味着仅包含且仅包含)UserB
SiteB
SiteB
UserB
SiteA
UserA
所以要更新我上面的问题,我将如何维护UserList
服务器之间的关系?我会使用 SQL 背板来实现这一点吗?
c# - 一个背板上的多种 SignalR 集线器类型——优点/缺点/可扩展性?
最近,我们尝试通过使用 SQL 背板更改几个 Web 应用程序上的 SignalR 以在 Web 场情况下工作。
当我探索它是如何工作的(朝着最大可扩展性、最少故障点的目标)时,我们可以调整它的不同方式的数量正在成倍增加。
目前,每个应用程序都使用 SignalR 来支持对数据库中记录的更改进行轮询驱动的广播。
关于对所有应用程序上的所有 SignalR 实例使用一个背板的基本假设/观察:
具有一个公共背板的所有集线器和集线器实例(所有类型)仅存在于一条消息总线上。
所有集线器实例本质上都“合并”了它们的客户端池。集线器实例实际上无法知道他们有多少客户端。
在 AppA 的跟踪输出中可以看到来自某些 AppB_Hub 的消息流量。我假设如果 AppA 有一个同名的集线器,他们就会发生冲突——或者只要他们意识到他们将共享客户端,就可能不会发生冲突。
问题/疑虑/未知数:
- 不同的集线器(不同的集线器类型,可能是不同的组件)玩得很好吗?即一个消息和电话会干扰另一个吗?在什么情况下?
- 这一切都基于命名吗?即,如果 AppAHub 和 AppBHub 想要玩得很好,他们需要确保他们的方法和回调名称不同吗?还是只要集线器名称不同,它们就已经不同了?
- 假设它“足够安全”,它是否可以很好地“扩展”以让每个应用程序筛选彼此应用程序的消息。在一定程度上拥有一个单独的背板是否值得。在小范围内值得吗?例如:2 种集线器,每种 2 个实例。
- 或者,AppAHub 和 AppBHub 有可能实际上只是进入同一个集线器的两个接口,因此 AppA 可以随时了解 AppB,反之亦然。我想知道如果我们知道它们都会被喂饱,那么它们作为独立的中心是否有任何意义。或者这是否会为 AppA 激活一些不可避免的额外成本,因为它更明确地“关心”了 AppB 消息?
c# - SignalR Redis 背板不工作 - 依赖问题?
我们在冗余 Azure Web 应用程序中使用 SignalR 和 Redis(Azure 缓存)背板。几天前我们检测到所有 SignalR 消息似乎都没有送达(过去一直有效),因此表明背板有问题。
该应用程序使用 ASP.Net Owin 启动以及 Autofac 作为集线器的 IoC,我们像这样启动 SignalR:
如果我将 Redis 背板配置字符串更改为无效的内容也没关系,它只是无法连接。SignalR 代码位于 Web 主机之外的另一个程序集中。
我在应用程序本身中没有任何异常,但是在跟踪 SignalR 时出现以下错误:
SignalR.ReflectedHubDescriptorProvider 警告:0:搜索集线器时无法加载程序集“Microsoft.AspNet.SignalR.Owin,Version=1.2.2.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”中的某些类。[C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET
Files\root\79fa3057\a44a64e\assembly\dl3\75de3633\cfc73faf_eb21d101\Microsoft.AspNet.SignalR.Owin.dll]
原始异常类型:ReflectionTypeLoadException 原始异常消息:无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。
这是nuget的依赖问题吗?
以下是我们的 packages.config 的相关摘录:
真的很感谢你的帮助!
asp.net - 使用 Azure Redis 缓存存储 Session 数据和 SignalR 背板
因此,我正在准备一个较旧的企业级 ASP.net 解决方案,以转移到 Azure。我们希望将单个 Azure Redis 缓存用于会话状态和 SignalR 背板。
作为团队的新成员,不熟悉 SignalR,我在 这里构建教程作为起点。从那里,我设置了 Session-State 提供程序并能够使其正常工作。我写了一篇关于它的博客文章,但我还没有足够的声誉来分享。:/
但是到了实现 SignalR Redis 背板的时候,我没有成功。
这是我尝试过的代码:
这是我在启动网站时遇到的错误示例,并导航到进行 SignalR 调用的页面。
有人成功做到这一点吗?