Signalr 不发送给特定用户

Signalr not sending to specific users

我的中心内有一个方法,用于向特定客户发送票证已更新的信息。但是我希望它将它发送到控制器内的服务器和特定用户,你可以在下面看到我是怎么做的:

我正在使用以下方法发送给特定的客户:

public void NotifyUpdatedTicket(Ticket ticket, string note, params string[] aliases)
{
    foreach (string a in aliases)
    {
        foreach (string connectionId in _allConnections.GetConnections(a))
        {
            Clients.Client(connectionId).notifyUpdatedTicket(ticket, note);
        }
    }
}

_allConnections 与 http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#inmemory

中的 class 相同

然而,我没有传递 1 个用户,而是传递了一个别名列表,然后获取他们的连接并发送到他们的连接 ID。

但是它似乎没有正确发送它发送给所有客户端。这是我用来在控​​制器中调用方法的命令:

GlobalHost.ConnectionManager.GetHubContext<TicketHub>().Clients.All.notifyUpdatedTicket(viewModel.Current, viewModel.NewNote, viewModel.Current.OpenedBy, viewModel.Current.AssignedTo);

当我发送带有特定 OpenedBy 和 AssignedTo 的上述命令时,它会在不应该发送给所有用户时发送给所有用户。

我是否遗漏了在控制器中调用它只发送给特定用户或其他东西的东西?

即使我将人员别名直接输入集线器方法,它仍会发送给所有人。我认为这与控制器方法有关。

这个

Clients.All.notifyUpdatedTicket

将向所有客户端发送一条消息。它不会用这个签名调用你的方法(我假设这就是你想要做的):

public void NotifyUpdatedTicket(Ticket ticket, string note, params string[] aliases)

我假设这是您添加到中心的方法 class。 如果方法的唯一目的是从服务器端调用,那么将方法放在集线器 class 中并不是一个好主意。

无论如何,如果这样做,您需要在该方法中使用 GetHubContext<TicketHub>(),即使它是集线器 class 的一部分,因为集线器上下文已设置为集线器的一部分当对该集线器的请求到达时流水线。没有它,集线器只是一个常规的 class,您无法访问像 Clients.

这样的动态成员

所以,总而言之,您似乎对某些基本原理感到困惑。我建议将 NotifyUpdatedTicket 移动到一个单独的 class,它也缓存相关的集线器上下文,然后在需要时调用该方法(例如,如果这是您的意图,则从 MVC 控制器方法调用)。