SignalR 多用户实时聊天去同步化
SignalR multi user live chat desynchronisation
我有一个多人同时连接的实时聊天。所有 public 消息传递都正常,但有时无法向特定 ID 发送私人消息。我相信我将其缩小到当人们断开连接并重新连接时他们连接到另一个实例(也许 IIS 已经回收并启动了一个新的集线器)。
我以为我已经修好了,但我没有,现在我在这里是因为我被卡住了。我认为可以解决的是更改 startChat() 函数中的连接变量以使用正确的信息刷新它。
这是代码的简化版本,因为我不认为剩下的是必要的。
问题是,当连接到直接发送给他们的消息的 signalR 收件人时,即使发送给它的聊天 ID 正确,也无法通过。可能 hub/socket 不匹配?
var chat = $.connection.chatHub;
$(document).ready(function () {
// Start the chat connection.
startChat();
//restart chat if disconnected
$.connection.hub.disconnected(function () {
setTimeout(startChat(), 5000);
});
$.connection.hub.error(function (error) {
$('#messagebar').html('Chat ' + error + '. If this message doesn\'t go away, refresh your page.');
});
chat.client.addToChat = function (response) {
$('#chat-' + response.Type).prepend(response.Message);
};
});
function startChat() {
chat = $.connection.chatHub;
$.connection.hub.start().done(function () {
//get recent chat from db and insert to page.
//also saves user's chat id to their user for lookup when private messaging
$.ajax({
method: 'POST',
url: '/api/Chat/SetupChat/'
});
$('#messagebar').html('Connected to chat.');
});
}
感谢任何帮助,谢谢。
不确定您的消息究竟是如何丢失的,但您应该将消息发送给用户而不是通过连接 ID。这样您就可以在服务器上识别用户至少有一个连接,并向该用户的所有连接发送消息。如果给定的连接 ID 不再有效,但另一个有效(例如,因为客户端刷新了页面),则消息不会丢失。
来自文档 https://docs.microsoft.com/en-us/aspnet/core/signalr/groups:
The user identifier for a connection can be accessed by the
Context.UserIdentifier property in the hub.
public Task SendPrivateMessage(string user, string message)
{
return Clients.User(user).SendAsync("ReceiveMessage", message);
}
不确定这与您的服务器代码有什么关系,但如果您不清楚如何进行,可以添加它。
我有一个多人同时连接的实时聊天。所有 public 消息传递都正常,但有时无法向特定 ID 发送私人消息。我相信我将其缩小到当人们断开连接并重新连接时他们连接到另一个实例(也许 IIS 已经回收并启动了一个新的集线器)。 我以为我已经修好了,但我没有,现在我在这里是因为我被卡住了。我认为可以解决的是更改 startChat() 函数中的连接变量以使用正确的信息刷新它。 这是代码的简化版本,因为我不认为剩下的是必要的。
问题是,当连接到直接发送给他们的消息的 signalR 收件人时,即使发送给它的聊天 ID 正确,也无法通过。可能 hub/socket 不匹配?
var chat = $.connection.chatHub;
$(document).ready(function () {
// Start the chat connection.
startChat();
//restart chat if disconnected
$.connection.hub.disconnected(function () {
setTimeout(startChat(), 5000);
});
$.connection.hub.error(function (error) {
$('#messagebar').html('Chat ' + error + '. If this message doesn\'t go away, refresh your page.');
});
chat.client.addToChat = function (response) {
$('#chat-' + response.Type).prepend(response.Message);
};
});
function startChat() {
chat = $.connection.chatHub;
$.connection.hub.start().done(function () {
//get recent chat from db and insert to page.
//also saves user's chat id to their user for lookup when private messaging
$.ajax({
method: 'POST',
url: '/api/Chat/SetupChat/'
});
$('#messagebar').html('Connected to chat.');
});
}
感谢任何帮助,谢谢。
不确定您的消息究竟是如何丢失的,但您应该将消息发送给用户而不是通过连接 ID。这样您就可以在服务器上识别用户至少有一个连接,并向该用户的所有连接发送消息。如果给定的连接 ID 不再有效,但另一个有效(例如,因为客户端刷新了页面),则消息不会丢失。
来自文档 https://docs.microsoft.com/en-us/aspnet/core/signalr/groups:
The user identifier for a connection can be accessed by the Context.UserIdentifier property in the hub.
public Task SendPrivateMessage(string user, string message)
{
return Clients.User(user).SendAsync("ReceiveMessage", message);
}
不确定这与您的服务器代码有什么关系,但如果您不清楚如何进行,可以添加它。