.NET 4.8 SignalR Clients.Group无法在Angular前端接收消息
我在.NET 4.8中结合Angular使用SignalR实现群组聊天,通过JoinToTestGroup方法将用户加入"TestGroup"群组,但调用Clients.Group("TestGroup").ReceiveTestGroupMessage(...)时前端无法接收消息,换成Clients.All.ReceiveTestGroupMessage(...)就能正常接收,这是什么原因?
服务端(C#)代码:
public void SendMessageToTestGroup(string message, string senderName) { var connectionId = Context.ConnectionId; var users = _connection.Where(k => k.Key == connectionId).Select(k => new { k.Value.User, k.Value.Room }); Clients.Group("TestGroup").ReceiveTestGroupMessage(senderName, message); } public void JoinToTestGroup() { Groups.Add(Context.ConnectionId, "TestGroup"); Clients.Group("TestGroup").NewRoomCreated(""); SendAllGroups(); }
客户端(Angular)代码:
this.proxy_48.on('ReceiveTestGroupMessage', (user: string, message: string) => { debugger console.log(message); this.messages = [...this.messages, { user, message }]; this.messages$.next(this.messages); });
可能的原因及排查方向:
群组加入操作未完成
.NET 4.8的SignalR中Groups.Add是异步操作,返回Task,如果不等待操作完成就发送消息,用户可能还没真正加入群组。修改JoinToTestGroup为异步方法并等待:public async Task JoinToTestGroup() { await Groups.Add(Context.ConnectionId, "TestGroup"); Clients.Group("TestGroup").NewRoomCreated(""); SendAllGroups(); }也可以通过
Groups.GetGroups(Context.ConnectionId)验证当前连接是否真的在目标群组中。群组名称不一致
SignalR群组名称区分大小写,检查服务端加入、发送消息的群组名,和客户端逻辑中涉及的群组名是否完全一致,有没有拼写错误。ConnectionId有效性问题
确认SendMessageToTestGroup中获取的Context.ConnectionId是当前用户的有效连接ID,且该连接确实已加入"TestGroup"。可以在方法内打印当前连接所属群组,验证是否包含目标群组。版本兼容性问题
确保Angular端使用的SignalR客户端版本和服务端.NET 4.8的SignalR版本匹配,版本不兼容可能导致群组消息路由异常。连接重连后未重新加入群组
如果客户端连接断开后重连,之前加入的群组会丢失,需要在重连成功后重新执行加入群组的逻辑。
内容的提问来源于stack exchange,提问作者rakshith

