正在呼叫Clients.Others.SendAsync断开接收者的连接

问题描述 投票:1回答:2

为了测试我的应用,我打开了到在浏览器中localhost上运行的Signalr Hub的多个连接。它们连接良好,直到一个客户端调用Host函数,此时其他客户端抛出错误:

[[2020-04-23T18:17:18.374Z]调试:HubConnection已成功连接。Utils.ts:178 [2020-04-23T18:17:18.511Z]调试:HttpConnection.stopConnection(错误:WebSocket已关闭,状态代码:1011()。)处于Connected状态时被调用。

Utils.ts:168 [2020-04-23T18:17:18.511Z]错误:连接已断开,错误为'错误:WebSocket已关闭,状态码为1011()。]

Utils.ts:178 [2020-04-23T18:17:18.512Z]调试:HubConnection.connectionClosed(错误:WebSocket已关闭,状态代码:1011()。)在连接状态下被调用。

这是服务器端的功能

        public async Task Host(string lobbyId)
        {
            //generate _lobbies here...
            await Clients.Others.SendAsync("ReceiveLobbies", 
                new { lobbies = new Lobby[] { _lobbies } })
        }

客户端功能“ ReceiveLobbies”由于连接已关闭而未调用。我已经进行了快速测试,并且知道在本地主机上可以有多个客户端,所以为什么会发生这种情况?

asp.net-core asp.net-core-signalr
2个回答
1
投票

我的大厅对象包含一个播放器对象的列表,每个对象都有自己的大厅属性,在序列化过程中会无限次递归

[您可以尝试安装Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson NuGet软件包以切换到Newtonsoft.Json,然后可以通过设置ReferenceLoopHandling设置使其忽略循环引用,而不是引发异常,如下所示。

services.AddSignalR().AddNewtonsoftJsonProtocol(opt=> {
    opt.PayloadSerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});

0
投票

调试信号器应用程序后,我意识到我遇到了json序列化错误,因为大厅变量的深度超出了限制,这是因为显而易见的原因是我的Lobby对象包含一个Player对象列表,每个对象都有各自的Lobby属性,序列化期间的无限递归

© www.soinside.com 2019 - 2024. All rights reserved.