Clients.Client(Context.ConnectionId).Message(name)不调用SignalR中的客户端JavaScript方法

时间:2018-04-30 06:28:49

标签: javascript c# model-view-controller signalr

我正在使用SignalR来更新Asp.net MVC中的用户任务 但是我遇到了问题,在我的集线器SignalR类中,下面的方法不会调用客户端方法来更新客户端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;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

  

通常在调用start方法之前注册事件处理程序   建立连接。如果你想注册一些活动   建立连接后的处理程序,你可以这样做,但你   必须在调用之前注册至少一个事件处理程序   启动方法。其中一个原因是一个中心可能有很多   应用程序,但您不希望触发OnConnected事件   如果您只使用其中一个,那么每个Hub。当。。。的时候   建立连接,在Hub上存在客户端方法   proxy是告诉SignalR触发OnConnected事件的东西。如果你   在调用start方法之前,请不要注册任何事件处理程序   将能够在Hub上调用方法,但是Hub的OnConnected   将不会调用方法,也不会从中调用任何客户端方法   服务器

答案 1 :(得分:0)

只是为了尝试一下,您是否尝试过使用hub上下文传递的connectionID? this.Context.ConnectionId这是客户端调用的当前ID,将您提取的ID与其进行比较并查看其是否正确。

我没有调用客户端方法的其他问题是代理集线器在连接开始之前还没有正确初始化,所以我会调查它。希望它有所帮助。