为什么多次收到此 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
而未在组件上配置 IDispose
或 IAsyncDispose
来处理 HubConnection 时,可能会发生这种情况。
在 Blazor 服务器端应用程序中,已经有一个 SignalR 主机将更新推送到客户端。
如果您想从页面推送更新,您可以使用 Singleton Service 来处理通信。
如果您设置自己的 SignalR 集线器并在您的组件中使用 SignalR 客户端,您的应用程序类似于下图:
如您所见,客户端实际上是 运行 在 服务器 上。您添加的 SignalR 集线器增加了处理和内存开销,但没有增加任何价值。
我创建了一个简单的示例应用程序,它使用客户端侦听更新的服务:
https://github.com/conficient/BlazorServerWithSignalR
我在 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
而未在组件上配置 IDispose
或 IAsyncDispose
来处理 HubConnection 时,可能会发生这种情况。
在 Blazor 服务器端应用程序中,已经有一个 SignalR 主机将更新推送到客户端。
如果您想从页面推送更新,您可以使用 Singleton Service 来处理通信。
如果您设置自己的 SignalR 集线器并在您的组件中使用 SignalR 客户端,您的应用程序类似于下图:
如您所见,客户端实际上是 运行 在 服务器 上。您添加的 SignalR 集线器增加了处理和内存开销,但没有增加任何价值。
我创建了一个简单的示例应用程序,它使用客户端侦听更新的服务: https://github.com/conficient/BlazorServerWithSignalR