Signalr 信号器-向特定用户发送推送通知

Signalr 信号器-向特定用户发送推送通知,signalr,Signalr,我正在为一个通知引擎开发一个PoC。我能够成功地从JS连接和调用集线器函数,但我似乎无法让推送通知工作。我得到一个对象引用未设置为对象的实例错误 触发类 [HubName("NotificationHub")] public class NotificationHub : Hub { //ctor public override Task OnConnected() { var userId = Context.QueryString

我正在为一个通知引擎开发一个PoC。我能够成功地从JS连接和调用集线器函数,但我似乎无法让推送通知工作。我得到一个
对象引用未设置为对象的实例
错误

触发类

[HubName("NotificationHub")]
public class NotificationHub : Hub
{

    //ctor
    public override Task OnConnected()
    {
        var userId = Context.QueryString["userid"];
        if(userId.IsNotNullOrEmpty())
        _connections.Add(Context.ConnectionId, Guid.Parse(userId));
        else
            _connections.Add(Context.ConnectionId, Guid.NewGuid());
        return base.OnConnected();
    }
    

    public override Task OnDisconnected(bool stopCalled = true)
    {
        _connections.Remove(Context.ConnectionId);
        return base.OnDisconnected(stopCalled);
    }
    public override Task OnReconnected()
    {
        Guid userId;
        if (Guid.TryParse(Context.QueryString["userid"],out userId))
        {
            //var userId = _workContext.CurrentUser.Id;
            var userConnection = _connections.GetUserByConnection(Context.ConnectionId);
            if (userConnection == null || userConnection.IsNotNullOrEmpty())
            { 
                _connections.Add(Context.ConnectionId, userId);
            }
        }
       

        return base.OnReconnected();
    }
}
//我能够确认
连接ID
有效

   public void HandleEvent(NewNotificationEvent eventMessage)
   {
        // _connections handles connectionids of a user
        // multiple connection ids to handle multiple open tabs
        var connectionIds = _connections.GetConnectionsByUser(eventMessage.Notification.UserId);

        foreach(var connectionId in connectionIds)
        {
            // a client is returned, but aside from the connectionid, all the properties are either null or empty
            var client = _notificationHub.Clients.Client(connectionId);
            
            ///// ERROR HAPPENS HERE
            ///// I'm guessing NewNotification() isn't defined somewhere, but I don't know where.
            client.NewNotification("Hello");
        }
    }
View.cshtml

    var notificationHub = $.connection.NotificationHub;
    $.connection.hub.qs="userId=@userId"

    // Initialization
    $.connection.hub.start().done(function () {
        // get count unread notification count
        notificationHub.invoke("unReadNotificationsCount")
            .done((unreadCount) => {
                if (unreadCount > 0) {
                    $('#notificationBadge').html(unreadCount);
                    hasNewNotification = true;
                }
                console.log('SignalR connected!');
            })
            .fail((data) => {
                console.log('Unable to reach server');
                console.log(data);
            })
            .always(() => $('#dropdownNotificationOptions').show());
      
    });
    // also tried notificationHub.NewNotification()
    notificationHub.client.NewNotification = function (notification) {
        console.log(notification);
    }
NotificationHub.cs

[HubName("NotificationHub")]
public class NotificationHub : Hub
{

    //ctor
    public override Task OnConnected()
    {
        var userId = Context.QueryString["userid"];
        if(userId.IsNotNullOrEmpty())
        _connections.Add(Context.ConnectionId, Guid.Parse(userId));
        else
            _connections.Add(Context.ConnectionId, Guid.NewGuid());
        return base.OnConnected();
    }
    

    public override Task OnDisconnected(bool stopCalled = true)
    {
        _connections.Remove(Context.ConnectionId);
        return base.OnDisconnected(stopCalled);
    }
    public override Task OnReconnected()
    {
        Guid userId;
        if (Guid.TryParse(Context.QueryString["userid"],out userId))
        {
            //var userId = _workContext.CurrentUser.Id;
            var userConnection = _connections.GetUserByConnection(Context.ConnectionId);
            if (userConnection == null || userConnection.IsNotNullOrEmpty())
            { 
                _connections.Add(Context.ConnectionId, userId);
            }
        }
       

        return base.OnReconnected();
    }
}

您应该在$.connection.hub.start()之前有新通知,例如:


显示更多的view.cshtml,特别是围绕$.connection.hub.start().done(函数())显示,并使用单个用户组检查同一用户的多个选项卡/窗口连接,这使得向该用户发送通知更容易-更新了帖子。将查看Clients.Group().NewNotification()的实现是否有任何问题?