首页 > 解决方案 > 带有redis背板的信号器,向用户发送消息

问题描述

我正在研究使用信号器将消息从 api 发送到特定用户(关键字)。在本地,我的一切都按设计工作(即使使用 redis 背板)。

当我升级到具有多个服务器(azure app 服务)的实际环境时,发送给特定用户的消息似乎不会通过背板流动。如果我向 Clients.All 发送消息,它会起作用。但是,如果我向 Clients.User(username) 发送消息,则永远不会收到该消息。这可以在本地工作,因为它是单个服务器,但似乎不适用于多个服务器。

await this.impersonationContext.Clients.User(mainUserName).SendAsync("msguser", new object[] { mainUserName });
await this.impersonationContext.Clients.All.SendAsync("msg", new object[] { "wtf" });

如果我调用上面的代码,只会触发 msg 事件,但永远不会收到 msguser。

我会在设置上遗漏一些东西吗?这是我的假设,我不能是唯一这样做的人。

下面是我在 startup.cs 中的设置。这是使用 .net core 5 和最新的 nugets 等

services.AddSignalR(options =>
        {
            options.EnableDetailedErrors = true;
        })
        .AddStackExchangeRedis(this.Configuration["Redis:Cache"], options => {
            options.Configuration.ChannelPrefix = "ImpersonationService";
        });
services.AddSingleton<IUserIdProvider, NameUserIdProvider>();

任何帮助,将不胜感激。

更新 #1 看起来用户信息正在通过背板推送(隐藏用户名)。那么也许是来自javascript客户端的连接? 在此处输入图像描述

更新 #2 越来越近...看​​起来订阅没有像我在本地看到的那样为特定用户设置。这可能是websockets吗? 在此处输入图像描述

更新 #3 找到它....排序。我错过了集线器上的授权属性,它允许 websocket 连接,即使 websockets 出于某种原因没有进行身份验证(不同的问题)。一旦我添加了授权,它将下拉到使用用户信息进行长轮询并按设计工作

标签: .net-coreredissignalrasp.net-core-5.0

解决方案


推荐阅读