首页 > 解决方案 > Signalr .net core 2.2 - 发送到非连接组的消息

问题描述

我正在使用带有 SignalR 版本 1.1.0 的 .net core 2.2。当我测试该应用程序时,不属于该组的成员正在接收消息。我的组是在运行时根据相关标准动态创建的,如: var TheHub = CurrUser.Hubname; 我无法弄清楚为什么不在组中的组成员也会收到消息。我要发送给 GROUP 而不是 ALL。

请看代码。非常感谢任何帮助,我准备把我的头发拉出来。

我的枢纽班

public class Chathub : Microsoft.AspNetCore.SignalR.Hub
    {
        public override async Task OnConnectedAsync()
        {
            var TheHub = CurrUser.Hubname;  
            await Groups.AddToGroupAsync(Context.ConnectionId, TheHub.ToString());
            await base.OnConnectedAsync();
        }
        public Task SendMessageGroup(string user, string message)
        {
            var TheHub = CurrUser.Hubname;

            return Clients.Group(TheHub.ToString()).SendAsync("ReceiveMessage", user, message);
        }

    }

我的 Javascript

"use strict";


    document.getElementById("sendgroupButton").addEventListener("click", function (event) {
    var user = document.getElementById("userInput").value;
    var message = document.getElementById("messageInput").value;
    connection.invoke("SendMessageGroup", user, message).catch(function (err) {
        return console.error(err.toString());
    });
    event.preventDefault();
    playAudio();
});


var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();
document.getElementById("sendgroupButton").disabled = true;

connection.on("ReceiveMessage", function (user, message) {
    var msg = message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    var encodedMsg = user + " says " + msg;
    var li = document.createElement("li");
    li.textContent = encodedMsg;
    document.getElementById("messagesList").appendChild(li);
});

connection.start().then(function () {

    document.getElementById("sendgroupButton").disabled = false;
}).catch(function (err) {
    return console.error(err.toString());
});

这就是我获取 curruser.hubname 的当前值的方式,请参见下文。

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager
@if (SignInManager.IsSignedIn(User))
        {

         CurrUser.CurrentUsertId = UserManager.GetUserId(User);
            var ctx = new WebookContext();
            var LoggedInGuestHouseName = (from Ghouse in ctx.Guesthouse
                                          where Ghouse.UserId == CurrUser.CurrentUsertId
                                          select Ghouse).SingleOrDefault();
            //check to see if guesthouse details have been completed, if not skip this next line of code.
            if( LoggedInGuestHouseName != null)
            {
                CurrUser.GuestHouseName = LoggedInGuestHouseName.GuestHouseName;
                // add the hub to current user
                CurrUser.HubId = (int) LoggedInGuestHouseName.HubId;
                var Ghname = LoggedInGuestHouseName.GuestHouseName;
                var GhUserEmailaddress = LoggedInGuestHouseName.Emailaddress;
                var GhHuId = LoggedInGuestHouseName.HubId;
                CurrUser.GuestHouseName = Ghname;
                CurrUser.GuestHouseEmailaddress = GhUserEmailaddress;
                var q = (from gh in ctx.Hub

                             where gh.HubId == GhHuId
                         select gh).SingleOrDefault();
                     var myhubname = q.HubName;
                CurrUser.Hubname = myhubname;
            };

        }

标签: asp.net-coreasp.net-core-signalr

解决方案


看起来 SignalR 核心不适合虚伪的心。直到一本权威的书出来,一个人真的是瞎了眼。我已经研究过这个蓝色的主题,但可惜现在已经放弃了 SignalR。


推荐阅读