Clients.Client (Context.ConnectionId) .Message (name) не вызывает клиентский метод JavaScript в SignalR - PullRequest
0 голосов
/ 30 апреля 2018

Я использую 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 Client Method

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 голосов
/ 05 июня 2018

Просто для того, чтобы попробовать что-то, пытались ли вы использовать connectionID, переданный в контексте хаба? this.Context.ConnectionId это текущий идентификатор вызова клиента, сравните полученный вами идентификатор и посмотрите, верен ли он.

Другая проблема, с которой я столкнулся, когда клиентские методы не были вызваны, заключается в том, что прокси-концентраторы не были инициализированы должным образом до начала подключения, поэтому я хотел бы рассмотреть это также. Надеюсь, это поможет.

0 голосов
/ 30 апреля 2018

Вы должны зарегистрировать хотя бы один из ваших обработчиков событий перед вызовом метода запуска

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

Обычно вы регистрируете обработчики событий перед вызовом метода start установить соединение. Если вы хотите зарегистрировать какое-либо событие обработчики после установления соединения, вы можете сделать это, но вы необходимо зарегистрировать хотя бы один из ваших обработчиков событий перед вызовом метод запуска. Одна из причин этого заключается в том, что в приложения, но вы не хотите запускать событие OnConnected на каждый концентратор, если вы собираетесь использовать только один из них. Когда соединение установлено, наличие клиентского метода на хабе proxy - это то, что сообщает SignalR для запуска события OnConnected. если ты не регистрируйте обработчики событий перед вызовом метода start, вы сможет вызывать методы на концентраторе, но OnConnected концентратора метод не будет вызван, и никакие клиентские методы не будут вызваны из сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...