【问题标题】:SignalR multi user live chat desynchronisationSignalR 多用户实时聊天去同步
【发布时间】:2021-02-03 11:19:30
【问题描述】:

我有一个实时聊天,可以同时连接多个人。所有公共消息都可以正常工作,但有时对特定 ID 的私人消息不起作用。我相信我把它缩小到人们断开连接并重新连接到他们连接到不同实例的时候(也许 IIS 已经回收并启动了一个新的集线器)。 我以为我已经修好了,但我没有,现在我在这里,因为我被卡住了。我认为可以解决的问题是更改 startChat() 函数中的连接变量,以使用正确的信息刷新它。 这是代码的精简版本,因为我认为其余部分不是必需的。

问题是,当连接到 signalR 时,直接向他们发送消息的接收者无法通过,即使发送给它的聊天 ID 是正确的。可能的集线器/套接字不匹配?

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.');
    });
}

任何帮助表示赞赏,谢谢。

【问题讨论】:

标签: javascript c# jquery .net signalr


【解决方案1】:

不确定您的消息究竟是如何丢失的,但您应该向用户发送消息,而不是通过连接 ID。这样,您就可以在服务器上识别用户至少有一个连接,并向该用户的所有连接发送消息。如果给定的连接 id 不再有效,但另一个有效(例如,因为客户端已刷新页面),则消息不会丢失。

来自文档https://docs.microsoft.com/en-us/aspnet/core/signalr/groups

连接的用户标识符可以由 集线器中的 Context.UserIdentifier 属性。

public Task SendPrivateMessage(string user, string message)
{
    return Clients.User(user).SendAsync("ReceiveMessage", message);
}

不确定这与您的服务器代码有何确切关系,但如果您不清楚如何进行,可以添加它。

【讨论】:

  • 也许我应该更具体一点,并说明我没有使用核心。它使用的是 2.4.0。我会看看旧版本是否有类似的功能!
  • 使用您所说的,我发现您也可以在旧版本的 SignalrR 中创建自定义 IUserIdProvider,这样您就可以完全按照您在回答中的建议进行操作。
  • 我碰巧也在我当前的项目中使用了那个版本,很高兴你找到了正确的文档:)
猜你喜欢
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多