在 SignalR 中使用基数 class

Using a base class in SignalR

使用 SignalR,我在下面有以下 Hub classes,在这里我想在 Base Hub class:

中收集共享方法


HubBase

public class HubBase : Hub
{
    public readonly static ConnectionMapping<string> _connections =
        new ConnectionMapping<string>();

    public override Task OnConnected()
        string name = Context.User.Identity.Name;
        _connections.Add(name, Context.ConnectionId);
        return base.OnConnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        string name = Context.User.Identity.Name;
        _connections.Remove(name, Context.ConnectionId);
        return base.OnDisconnected(stopCalled);
    }

    public override Task OnReconnected()
    {
        string name = Context.User.Identity.Name;
        if (!_connections.GetConnections(name).Contains(Context.ConnectionId))
        {
            _connections.Add(name, Context.ConnectionId);
        }
        return base.OnReconnected();
    }


    public void SendChatMessage(string who, string message)
    {
        string name = Context.User.Identity.Name;
        foreach (var connectionId in _connections.GetConnections(who))
        {
            Clients.Client(connectionId).addChatMessage(name + ": " + message);
        }
    }
}


StockHub

public class StockHub : HubBase
{
    private static IHubContext context = GlobalHost
       .ConnectionManager.GetHubContext<StockHub>();

    public static void SendStockData(object data) {
        context.Clients.All.sendStockData(data);
    }
}


StockHub

public class ChatHub : HubBase
{
    private static IHubContext context = GlobalHost
       .ConnectionManager.GetHubContext<ChatHub>();

    public static void SendMessage(string message) {
        context.Clients.All.sendMessage(message);
    }
}


我的问题是:

1- 由于 HubBase 由 Stock 和 Chat hub classes 继承,我认为所有连接到这些方法之一的客户端都将添加到 HubBase 中的连接用户。因此,当我向连接到 StockHub 的客户端广播数据时,我也会向连接到 ChatHub 的其他客户端广播数据。是真的吗?

2- 如果不在 Stock 和 Chat 中心而不是 Base 中心 (HubBase) 中定义所有连接 classes,我该如何解决这个问题?

因为为所有集线器定义这些共享方法是不合逻辑的 classes,我需要区分连接到 StockHub 的用户。我怎样才能做到这一点?

3-除此之外,我想知道如果我不使用这些连接方法的 none 和任何基础 class(分别定义每个集线器 classes 会怎么样没有关系),并使用 Clients.All 方法来广播数据,在这种情况下,广播是否只会 到连接我的集线器的客户端?如果是这样,对于这种情况,就不需要使用连接方法(假设我向连接到 StockHub 的所有客户端广播)。是真的吗?

SignalR 允许将消息发送到与特定用户关联的所有连接,以及指定的连接组。

SignalR 中的组:它为您管理与 Hub 关联的用户和组

public async Task AddToGroup(string groupName)
{
    await Groups.AddToGroupAsync(Context.ConnectionId, groupName);

    await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
}

public async Task RemoveFromGroup(string groupName)
{
    await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);

    await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
}

阅读更多关于 here

希望对你有帮助。