Сообщение о ходе обновления только на открытую вкладку (unique Connectionid) / SignalR

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

Я могу отправлять обновления статуса, но только всем пользователям, у которых открыта веб-страница.

//Server side (works just fine)
public class SendCustomText : Hub
{
    public string myStatus;
    public void CurrentStatus()
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<SendCustomText>();
        context.Clients.All.setStatus(myStatus);
    }
}

//Client side
<script type="text/javascript">
$(function () {
    //Declare a proxy to the reference hub
    var currentStatus = $.connection.sendCustomText;
    currentStatus.client.setStatus = function (value) {
        $('#signalr_french_status').text(value.toString());
    }
    $.connection.hub.start().done(function () {
        $('pandora_french_panel_extract_button').click(function () {
            currentStatus.server.send();
        })
    })
    $.connection.hub.disconnected(function () {
        $.connection.hub.start();
    })
})

Однако мне нужен способ обновления прогресса только на открытой вкладке. Вошедший в систему пользователь может открыть другую вкладку и обработать другое задание, и эта новая вкладка должна отображать свой собственный прогресс.

Я попытался успешно получить идентификатор подключения на стороне клиента, а затем передать его через AJAX на серверный код. Мне нужна ваша помощь с примером, где идентификатор соединения используется в концентраторе.

context.Clients.Client(connectionID).setStatus();

1 ответ

  1. Я мог бы решить проблему сам. (Сначала я допустил очень грубую ошибку. Первый раз я использовалpublic string myConnectionID, то есть, без staticключевого слова.)

    public class SendCustomText : Hub
    {
        public string myStatus;
        public static string myConnectionID;
    
        public void CurrentStatus()
        {
            var context = GlobalHost.ConnectionManager.GetHubContext<SendCustomText>();
            context.Clients.Client(myConnectionID).setStatus(myStatus);
        }
        public override System.Threading.Tasks.Task OnConnected()
        {
            myConnectionID = Context.ConnectionId;
            return base.OnConnected();
        }
    }