【问题标题】:SignalR Private Chat Not Returning DataSignalR 私人聊天不返回数据
【发布时间】:2018-12-18 14:57:30
【问题描述】:

我在我的项目中实现了 SignalR。但是我在发送私人消息时遇到问题。我正在从页面发送“toConnectionID”。

ChatHub.cs

public void LoadPrivateMessages(string toUserName,string toConnectionID)
        {
            var chatHub = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();             
            string fromUserName = Context.QueryString["userName"].ToString();
            string fromConnectionID = Context.ConnectionId;

            List<ChatMessageDetail> currentMessages = cachePrivateMessages.Where(x => x.ToUserName == toUserName && x.FromUserName == fromUserName && x.ToConnectionID==toConnectionID && x.FromConnectionID==fromConnectionID).ToList();


            chatHub.Clients.Client(toConnectionID).privateMessagesHistory(currentMessages);

        }

我的 currentMessages 列表正在填满。我在这里很好。但我无法将消息带到页面。

Javascript

chatHub.client.privateMessagesHistory = function (data) {
                console.log(data);

            };

在这段 JavaScript 代码之后,我的控制台屏幕为空。

编辑:

这是我在 document.ready 函数中的连接代码。其次是发送接收者的信息。

var chatHub = $.connection.chatHub;
            $.connection.hub.qs = { "userName": "@Session["userName"]" };
        $.connection.hub.start().done(function () {
            console.log("Connection OK !");
        });


 $(document).on('click','.onlineUser', function () {
            var userName = $(this).attr('id');//That is which user to send(Receiver)
            var toConnectionID = $(this).attr('connectionID');
            chatHub.server.loadPrivateMessages(userName, toConnectionID);
            $('.privateMessagediv').show();
            $('.userName').html("");
            $('.userName').append("<h4>" + userName + "</h4>");
            $('.btnSendingPrivateMessage').attr('id', userName);
            $('.btnSendingPrivateMessage').attr('connectionid', toConnectionID);

            chatHub.client.privateMessagesHistory = function (data) {
                $('#privateChatBox').append(data);

            };
        });

编辑 2:

我解决了问题。

chatHub.Clients.Client(fromConnectionID).privateMessagesHistory(currentMessages);

而不是

chatHub.Clients.Client(toConnectionID).privateMessagesHistory(currentMessages);

【问题讨论】:

  • 你能显示你的客户端注册吗?我还想检查另外 2 个步骤
  • @reckface 当然。
  • @reckface 我添加了。

标签: signalr signalr-hub signalr.client


【解决方案1】:

我最初的怀疑是 toConnectionId,但在检查了您的 privateMessageHistory 回调注册后,这更有可能是时间问题。

您需要在集线器之前设置客户端回调.start()

来自Microsoft:

通常在调用 start 方法之前注册事件处理程序 建立连接。如果你想注册一些事件 建立连接后的处理程序,您可以这样做,但是您 在调用 启动方法

没有必要将你的回调注册放在点击事件中。

var chatHub = $.connection.chatHub;
$.connection.hub.qs = { "userName": "@Session["userName"]" };
// callback first
chatHub.client.privateMessagesHistory = function (data) {
    $('#privateChatBox').append(data);
};
// start the hub connection - note chatHub is different from your .hub
chatHub.start().done(function () {
    console.log("Connection OK !");
});

【讨论】:

  • 感谢您的提问。但我的场景是首先,用户在私人聊天框打开后点击用户名,然后在他们之间加载旧消息。我不明白为什么我之前设置了客户端回调? :( 我的代码应该是怎样的?
  • 我尝试了您的解决方案,但出现错误。 $.connection.chatHub.start 不是函数
  • 我更改了 $.connection.hub.start()。没有数据返回。
  • @Developer007 在你的 sn-p 你说var chatHub = $.connection.chatHub;。要么你的 sn-p 错误,要么你犯了一个错误。
  • @rekface 再次向我问好。我遇到了一个奇怪的情况。当我点击我的昵称时,数据来了。但是当我点击其他用户昵称时不会出现:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2011-09-10
  • 2018-03-11
相关资源
最近更新 更多