在 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
希望对你有帮助。
使用 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
希望对你有帮助。