为什么多次收到此 SignalR 消息?

Why is this SignalR messages being received multiple times?

我在 Blazor 服务器端应用程序中使用 SignalR。我将 Microsoft.AspNetCore.SignalR.Client Nuget 包 (v5.0.11) 添加到项目中,并使用以下代码创建集线器连接...

HubConnection hubConnection = new HubConnectionBuilder()
  .WithUrl("url")
  .Build();
await hubConnection.StartAsync();

然后我发送了一条消息,其中包含以下代码(添加Debug.WriteLine 以确认发生了什么)...

Debug.WriteLine($"{DateTime.Now.ToLongTimeString()} SignalR msg sent");
await hubConnection.SendAsync("Send", "Hello");

处理此类消息的组件创建集线器连接并连接到 On 处理程序,如下所示...

HubConnection hubConnection = new HubConnectionBuilder()
  .WithUrl("url")
  .Build();
hubConnection.On<string>("Receive", msg =>
  Debug.WriteLine($"{DateTime.Now.ToLongTimeString()} SignalR msg received - {msg}"));
await hubConnection.StartAsync();

消息发出时,肯定只发送了一次(我从输出面板可以确认,我只看到“发送”输出一次),但收到了两次。

四处搜索,似乎一个常见的原因是 jQuery 被加载了两次。但是,我已经检查过,事实并非如此。它只被加载一次。此外,团队中的一位其他开发人员尝试了它,他收到了 15 次消息!即使我们不小心包含了 jQuery 两次,我们也肯定没有包含它 15 次。此外,他使用的代码与我完全相同(从源代码管理中检出),所以如果这是问题所在,我们应该得到相同的结果。

有人知道为什么会这样吗?谢谢

当您在组件中初始化 HubConnection 而未在组件上配置 IDisposeIAsyncDispose 来处理 HubConnection 时,可能会发生这种情况。

在 Blazor 服务器端应用程序中,已经有一个 SignalR 主机将更新推送到客户端。

如果您想从页面推送更新,您可以使用 Singleton Service 来处理通信。

如果您设置自己的 SignalR 集线器并在您的组件中使用 SignalR 客户端,您的应用程序类似于下图:

如您所见,客户端实际上是 运行 在 服务器 上。您添加的 SignalR 集线器增加了处理和内存开销,但没有增加任何价值。

我创建了一个简单的示例应用程序,它使用客户端侦听更新的服务: https://github.com/conficient/BlazorServerWithSignalR