首页 > 解决方案 > Clients.Client(Context.ConnectionId).Message(name) 不调用 SignalR 中的客户端 JavaScript 方法

问题描述

SignalR用来更新 Asp.net MVC 中的用户任务。
但是我有问题,在我的集线器SignalR类中,下面的方法不会调用客户端方法来使用 client 更新任务connectionId。当用户登录系统时,
我从连接列表中获取。 问题是用户已通过使用成功注销,但在这种情况下更新他的任务有问题吗? 问题出在哪里?connectionId
connectionId

强 SignalR Hub 方法文本

public void InvitationForConference(long assignedTo)
{
    try
    {
        var connectionId = GetUserCoonectionId(assignedTo);

        // Update Tasks
        Clients.Client(connectionId).invitationForAllConference(assignedTo);

        // Update Notifications
        Clients.Client(connectionId).invitationNotificationForAllConference(assignedTo);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

强大的 Js 客户端方法文本

signalR.client.invitationForAllConference = function (AssignedId) 
{
    debugger
    LoadTasks(AssignedId);
};

**strong  Js File text**
var IsLogin = '';
IsLogin = $("#LoginConnectionId").val();
var signalR = $.connection.signalRHUB;
debugger;
if (IsLogin == "OPEN") {
    $.connection.hub.start().done(function () {
        debugger
        IsLogin == "CLOSE";
        signalR.server.createConnection();
    });
}
else {
    $.connection.hub.start().done(function () {  });
}
signalR.client.invitationForAllConference = function (AssignedId) {
    debugger
    LoadTasks(AssignedId);
};
signalR.client.invitationNotificationForAllConference = function (AssignedId) {
    debugger
    LoadNotificationAlerts(AssignedId);
};

[Authorize]
public class SignalRHUB : Hub
{
    private readonly static ConnectionMapping<string> _connections =
       new ConnectionMapping<string>();
    private readonly IUnitOfWork _unitOfWork;
    private readonly UserManager<IdentityUser, long> _userManager;
    private readonly IUnitOfWork _unitOfWorkLazyLoad;

    public SignalRHUB(IUnitOfWork unitOfWork, IUnitOfWork unitOfWorkLazyLoad)
    {
        try
        {
            //_userManager = userManager;
            _unitOfWork = unitOfWork;
            _unitOfWorkLazyLoad = unitOfWorkLazyLoad;
        }
        catch (Exception ex)
        {
        }
    }


    public void InvitationForConference(long assignedTo)
    {
        try
        {
            var connectionId = GetUserCoonectionId(assignedTo);

            // Update Tasks
            Clients.Client(connectionId).invitationForAllConference(assignedTo);

            // Update Notifications
            Clients.Client(connectionId).invitationNotificationForAllConference(assignedTo);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

标签: javascriptc#model-view-controllersignalr

解决方案


在调用 start 方法之前,您必须至少注册一个事件处理程序

请参阅https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client

通常,您在调用 start 方法建立连接之前注册事件处理程序。如果您想在建立连接后注册一些事件处理程序,您可以这样做,但您必须在调用 start 方法之前注册至少一个事件处理程序。原因之一是应用程序中可能有多个 Hub,但如果您只使用其中一个 Hub,您不希望在每个 Hub 上触发 OnConnected 事件。建立连接后,集线器代理上存在客户端方法就是告诉 SignalR 触发 OnConnected 事件的原因。如果您在调用 start 方法之前没有注册任何事件处理程序,您将能够调用 Hub 上的方法,但 Hub 的 OnConnected 方法不会


推荐阅读