SignalR, как я могу получить доступ к заявкам от подключенных пользователей? - PullRequest
0 голосов
/ 27 мая 2020

В моем приложении. net core Я хочу уведомить пользователя о некоторых действиях, сделанных другим пользователем. Мое подключение к SignalR авторизовано, поэтому SignalR должен иметь доступ к утверждениям подключенных пользователей, и он имеет. enter image description here

В этих утверждениях у пользователей есть идентификаторы, поэтому я подумал, может быть, я смогу каким-то образом найти пользователя на основе этого идентификатора и отправить уведомление определенному пользователю, но я ' Я понятия не имею, как мне найти его в mHubContext, или, может быть, мне следует сделать это каким-либо другим способом?

Может быть, мне следует переопределить метод OnConnected и сохранить их идентификатор в каком-нибудь статическом c хеш-наборе / словаре?

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете использовать следующий подход для доступа к некоторым свойствам user, connection и т.д. c.

[HubName("demoHub")]
public class DemoHub : Hub
{
    public readonly static ConnectionMapping<string> connections = 
        new ConnectionMapping<string>();

    public override async Task OnConnected()
    {
        string name = Context.User.Identity.Name;
        connections.Add(name, Context.ConnectionId);
        //await Groups.Add(Context.ConnectionId, Context.QueryString["group"]);
        await base.OnConnected();
    }

    public override async Task OnDisconnected(bool stopCalled)
    {
        string name = Context.User.Identity.Name;
        connections.Remove(name, Context.ConnectionId);
        //await Groups.Remove(Context.ConnectionId, Context.QueryString["group"]);
        await base.OnDisconnected(stopCalled);
    }

    public override async Task OnReconnected()
    {
        string name = Context.User.Identity.Name;
        if (!connections.GetConnections(name).Contains(Context.ConnectionId))
        {
            connections.Add(name, Context.ConnectionId);
            //await Groups.Add(Context.ConnectionId, Context.QueryString["group"]);
        }
        await base.OnReconnected();
    }
}

Обновление: При необходимости вы можете использовать следующие методы или создавать похожие, используя тот же лог c:

public Task JoinToGroup(string groupName)
{
    return Groups.Add(Context.ConnectionId, groupName);
}

public Task LeaveFromGroup(string groupName)
{
    return Groups.Remove(Context.ConnectionId, groupName);
}

public async Task AddToGroup(string connectionId, string groupName)
{
    await Groups.Add(connectionId, groupName);
    //await Clients.Group(groupName).ReceiveMessage("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
}

public async Task RemoveFromGroup(string connectionId, string groupName)
{
    await Groups.Remove(connectionId, groupName);
    //await Clients.Group(groupName).ReceiveMessage("Send", $"{Context.ConnectionId} has left the group {groupName}.");
}
...