javascript - SignalR 多用户实时聊天去同步化

标签 javascript c# jquery .net signalr

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

问题是,当连接到直接发送给他们的消息的 signalR 收件人时,即使发送给它的聊天 ID 是正确的,也无法通过。可能的集线器/ 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://learn.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);
}

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

关于javascript - SignalR 多用户实时聊天去同步化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66026456/

相关文章:

javascript - 使用 jquery 或 java 脚本中的拖放功能填充空白

jquery - 我如何知道 jQuery 是否有待处理的 Ajax 请求?

javascript - 无法更新 react 应用程序的状态

javascript - 我们可以使用 Jmeter 运行特定的 Redis 查询吗?

c# - 如何更改我的wsdl的地址位置

c# - 并行执行查询会导致更多时间 [SQL Server]

c# - 在 WPF 应用程序中以编程方式设置文本框的颜色

javascript - HTML 表格过滤和回流

javascript - 在 Google Chrome 中捕获下载

javascript - 冲突 jQuery 插件