簡體   English   中英

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

[英]Clients.Client(Context.ConnectionId).Message(name) does not call to the client JavaScript method in SignalR

我正在使用SignalR更新Asp.net MVC中的用戶任務。
但是我有問題,在我的中心SignalR類中,以下方法未調用客戶端方法來使用客戶端connectionId更新任務。
當用戶登錄系統時,我從連接列表中獲取connectionId
問題是用戶已經通過使用connectionId成功注銷了,但是在這種情況下這是更新其任務的問題嗎?
問題出在哪兒?

強SignalR集線器方法文本

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;
        }
    }
}

在調用start方法之前,您必須至少注冊一個事件處理程序。

請參閱https://docs.microsoft.com/zh-cn/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client

通常,您在調用start方法建立連接之前注冊事件處理程序。 如果要在建立連接后注冊一些事件處理程序,則可以這樣做,但是在調用start方法之前,必須至少注冊一個事件處理程序。 原因之一是應用程序中可能有許多集線器,但是如果您只想使用其中一個集線器,則不想在每個集線器上觸發OnConnected事件。 建立連接后,指示集線器觸發OnConnected事件的集線器代理上存在客戶端方法。 如果您在調用start方法之前未注冊任何事件處理程序,則可以在Hub上調用方法,但是不會調用Hub的OnConnected方法,並且不會從服務器調用任何客戶端方法。

只是為了嘗試,您是否嘗試過使用由中心上下文傳遞的connectionID? this.Context.ConnectionId這是客戶端調用的當前ID,將您拉到的ID進行比較,看其是否正確。

我沒有調用客戶端方法時遇到的另一個問題是,代理集線器在連接開始之前尚未正確初始化,因此我也會對此進行調查。 希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM