【发布时间】:2021-12-08 11:47:58
【问题描述】:
我在 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 的处理。如果它在组件 init 上构造并且未释放,则您可能有多个实例。
-
@BrianParker 太棒了!这就是问题所在。您想将其添加为答案,我会接受。非常感谢。
-
问题:您要连接到的
SignalR集线器是否在托管 Blazor 服务器端的同一服务器上?如果是这样,您创建了一个完全不必要的设置:一个带有客户端的页面,在服务器上运行,连接到 SignalR 集线器也在同一台服务器上运行?跨度> -
@Quango 是的,它们在同一台服务器上,但是如果我不创建连接,如何向客户端发送消息?我认为这就是 SignalR 的全部意义所在。
-
@AvrohomYisroel 我会把我的答案放在下面,这样就很清楚了(另外我不能在 cmets 中插入图表)。
标签: signalr blazor asp.net-core-signalr