Azure 上的 SignalR 长断开连接超时

SignalR long disconnection timeout on Azure

我有一个 ASP 带有 SignalR 的 .Net Core 服务器应用程序。还有一个客户端应用程序也是用 .Net Core 和 SignalR 编写的。客户端连接到服务器,它们一起工作。

在本地开发环境中工作时,一切都按预期工作,但是当我将我的服务器应用程序部署到 Azure 应用程序服务时,我发现了奇怪的行为。

当客户端与服务器断开连接时,客户端断开连接的事件伴随着约 30 秒的巨大延迟。虽然客户端和服务器之间的其他调用正常工作,但我们仅在客户端断开连接事件时观察到延迟。

在调查此问题时,我提出了减少服务器设置中 KeepAliveInterval 的解决方案;

.AddSignalR(configure =>
{
    configure.EnableDetailedErrors = true;
    configure.MaximumReceiveMessageSize = null;
    configure.KeepAliveInterval = TimeSpan.FromSeconds(1);
    configure.EnableDetailedErrors = true;
});

然后客户端断开连接事件是即时的。

有人可以解释为什么这个问题出现在 Azure 的发布版本上吗?

本地开发环境没有出现该问题。

本地Release环境没有出现该问题

SignalR 集线器中 OnReconnected 事件处理程序可以在 OnConnected 之后直接执行,但不能在给定客户端的 OnDisconnected 之后执行。重连不掉线的原因有几种here

物理连接速度可能很慢或连接中断。根据中断时间长短等因素,传输连接可能会断开。 SignalR 然后尝试重新建立传输连接。有时传输连接API检测到中断并丢弃传输连接,SignalR立即发现连接丢失.

在其他情况下,transport connection APISignalR 都不会立即意识到 连接已丢失 。对于除长轮询之外的所有传输,SignalR client 使用一个名为 keepalive 的函数来检查传输 API 无法检测。有关长轮询连接的信息,请参阅此处 Timeout and keepalive settings l

参考更多info