code

SignalR 허브에 연결된 수신기, 클라이언트 수 가져오기

starcafe 2023. 6. 17. 09:31
반응형

SignalR 허브에 연결된 수신기, 클라이언트 수 가져오기

청취자 수(허브에 연결된 클라이언트)를 확인할 수 있는 방법이 있습니까?

하나 이상의 클라이언트가 연결되어 있으면 작업을 실행/시작하려고 합니다. 그렇지 않으면 시작하지 마십시오.

[HubName("taskActionStatus")]
public class TaskActionStatus : Hub, IDisconnect
{
    static CancellationTokenSource tokenSource;

    public void GetTasksStatus(int? siteId)
    {
        tokenSource = new CancellationTokenSource();
        CancellationToken ct = tokenSource.Token;

        ITaskRepository taskRepository = UnityContainerSetup.Container.Resolve<ITaskRepository>();

        // init task for checking task statuses
        var tasksItem = new DownloadTaskItem();
        taskRepository.GetTasksStatusAsync(siteId, tasksItem, ct);

        // subscribe to event [ listener ]
        tasksItem.Changed += new EventHandler<TaskEventArgs>(UpdateTasksStatus);
    }

    public void UpdateTasksStatus(object sender, TaskEventArgs e)
    {
        Clients.updateMessages(e.Tasks);
    }

    // when browsing away from page
    public Task Disconnect()
    {
        try
        {
            tokenSource.Cancel();
        }
        catch (Exception)
        {
            //
        }

        return null;
    }
}

감사해요.

신호 R에서 이 카운트를 가져올 수 있는 방법은 없습니다.다음을 사용해야 합니다.OnConnect()그리고.OnDisconnect()사용자가 직접 카운트를 유지할 수 있는 허브의 메서드.

카운트를 고정할 정적 클래스가 있는 간단한 예:

public static class UserHandler
{
    public static HashSet<string> ConnectedIds = new HashSet<string>();
}

public class MyHub : Hub
{
    public override Task OnConnectedAsync()
    {
        UserHandler.ConnectedIds.Add(Context.ConnectionId);
        return base.OnConnectedAsync();
    }

    public override Task OnDisconnectedAsync(Exception exception)
    {
        UserHandler.ConnectedIds.Remove(Context.ConnectionId);
        return base.OnDisconnectedAsync(exception);
    }
}

그러면 다음에서 카운트를 얻습니다.UserHandler.ConnectedIds.Count.

버전 2.1.1<의 경우:

public static class UserHandler
{
    public static HashSet<string> ConnectedIds = new HashSet<string>();
}

public class MyHub : Hub
{
    public override Task OnConnected()
    {
        UserHandler.ConnectedIds.Add(Context.ConnectionId);
        return base.OnConnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        UserHandler.ConnectedIds.Remove(Context.ConnectionId);
        return base.OnDisconnected(stopCalled);
    }
}

SIGnalR(버전 2.4.1)에서는 다음과 같이 매우 쉽습니다.

public int GetOnline()
{
   return GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>().GetConnections().Count;
}

클라이언트에서 이 메서드를 호출합니다(:

이제 다음이 필요합니다.

public override Task OnConnectedAsync()
{
    UserHandler.ConnectedIds.Add(Context.ConnectionId);

    return base.OnConnectedAsync();
}

public override Task OnDisconnectedAsync(Exception exception)
{
    UserHandler.ConnectedIds.Remove(Context.ConnectionId);
    return base.OnDisconnectedAsync(exception);
}

Azure Functions 및 Azure SignalR Service와 함께 서버리스 솔루션을 사용하는 경우 다음과 같은 문제가 해결되었습니다. https://github.com/Azure/azure-functions-signalrservice-extension/issues/54

이벤트 그리드를 사용하여 실시간 연결 수를 얻을 수 있는 이 샘플을 참조합니다.https://github.com/aspnet/AzureSignalR-samples/tree/master/samples/EventGridIntegration

사용하는 내 프로젝트에서Microsoft.AspNetCore.SignalR.Core버전1.1.0

디버그하고 카운트를 확인할 수 있습니다.

((Microsoft.AspNetCore.SignalR.DefaultHubLifetimeManager<XXX.Push.SignalR.EventHub>)((Microsoft.AspNetCore.SignalR.Internal.AllClientProxy<XXX.Push.SignalR.EventHub>)((Microsoft.AspNetCore.SignalR.TypedClientBuilder.IEventImpl)((Microsoft.AspNetCore.SignalR.Internal.HubClients<XXX.Push.SignalR.EventHub, XXX.Push.SignalR.IEvent>)_hub.Clients).All)._proxy)._lifetimeManager)._connections.Count

다음과 같이 표시됩니다.

debug

언급URL : https://stackoverflow.com/questions/13514259/get-number-of-listeners-clients-connected-to-signalr-hub

반응형