asp.net - Signalr-Redis "No Connection with that ID"

标签 asp.net asp.net-core redis signalr asp.net-core-signalr

背景

我有一个部署在谷歌云上的网站。本网站使用 asp.net core (v2.2) 和 signalr 编写。

我的应用程序架构是我有两台机器,运行 Linux,服务于同一个站点。该站点由 Kastrel(本地主机)提供服务并由 nginx 包装(用于外部网络)。我有云负载平衡器,它在这两个实例之间分配流量。 LB 定义为按 session 亲和性拆分流量。

我将 SignalR 定义为使用 Redis,以便在多实例环境中正常工作。

我的startup.cs代码:

var redisCs = ConfigurationOptions.Parse("REDIS CS");
services.AddSignalR().AddRedis(options =>
{
    options.ConnectionFactory = async writer =>
    {
        var connection = await ConnectionMultiplexer.ConnectAsync(redisCs, writer);
        return connection;
    };
    options.Configuration.ClientName = "Main-website-Signalr";
});

问题

当我对其进行测试时,有时它可以正常工作,而有时则不能。

当它失败时,我在浏览器控制台上看到这个日志:

WebSocket connection to 'wss://mysite.com/hubs/myhub?id=R_Zmaew-lRN_r2d_c-xOyg' failed: Error during WebSocket handshake: Unexpected response code: 404

在我的浏览器“网络”选项卡上,我看到浏览器尝试与地址 wss://mysite.com/hubs/myhub?id=R_Zmaew-lRN_r2d_c-xOyg 通信并获得 404回复。

我的调查

我担心 nginx 会以某种方式阻止连接,所以我决定在没有任何中介的情况下与 Kestrel 连接。我通过 ssh 进入机器并运行这个命令:

$ curl 127.0.0.1:5000/hubs/businesses?id=Tta4PmrjMrzHBHa8CT0SPQ -v
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0)
> GET /hubs/myhub?id=Tta4PmrjMrzHBHa8CT0SPQ HTTP/1.1
> Host: 127.0.0.1:5000
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Date: Wed, 05 Jun 2019 06:26:09 GMT
< Content-Type: text/plain
< Transfer-Encoding: chunked
<
* Curl_http_done: called premature == 0
* Connection #0 to host 127.0.0.1 left intact
No Connection with that ID

所以,我得到了 404 错误 - 就像我从浏览器上得到的一样。我想现在没有人以某种方式阻止连接。它只是 SignalR 配置的某些东西被破坏了。

为什么SignalR能找到连接?

我登录哪台机器有关系吗?连接不是通过 Redis 以某种方式传递的吗?

最佳答案

当您在单个负载均衡器后面有多个服务器实例时,您需要启用粘性 session ,这意味着唯一的客户端将永远只连接到一台机器。

您可以在 https://learn.microsoft.com/en-us/aspnet/core/signalr/scale?view=aspnetcore-2.2#redis-backplane 中查看有关 Redis 背板的一些信息

SignalR 是一种协议(protocol),该协议(protocol)的一部分意味着将在“协商”期间在服务器上创建连接 ID。这意味着您不能随意使用 ID curl 端点,因为 curl 不理解 SignalR 协议(protocol)。

如果您对该协议(protocol)感兴趣,可以阅读 https://github.com/aspnet/AspNetCore/tree/master/src/SignalR/docs/specs

关于asp.net - Signalr-Redis "No Connection with that ID",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56455782/

相关文章:

javascript - aspx 按钮防止回发 onclick (c#)

Azure AD + Open ID -> 限制登录域

redis查询结果顺序

javascript - 使用 Promise.all 时,Node_Redis HGET 解析为 bool 数组

RedisBloom : Option to add items (bit strings) as is with no hashing?

asp.net - 有没有办法我仍然可以在我的 ASP.NET MVC 2 项目中使用 app_offline.htm?如果没有,是否有替代方法?

asp.net - 获取 IIS 条目的配置数据库路径(安装已停止,因为指定的路径不是有效的 Web 应用程序)

css - Nginx 不会在树莓派的 Asp.net 核心上加载 css

azure - 使用 Azure AD 将用户登录到 ASP.NET Core 5 Web 应用程序时设置 cookie 过期的正确方法是什么?

iis - 在 IIS 中运行时,AspNet Core 使用内存存储库进行数据保护