信号器不发送给特定用户

时间:2015-03-12 13:56:35

标签: c# asp.net-mvc signalr signalr-hub

我的集线器内部有一个方法,用于向特定客户端发送故障单已更新。但是我希望它将它发送到控制器内的服务器和特定用户,你可以看到我在下面的方式:

我使用以下方法发送给特定客户端:

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

中的类相同

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

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

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

当我使用特定的OpenedBy和AssignedTo发送上述命令时,它会在不应该的情况下向所有用户发送。

我是否遗漏了在控制器中调用它的内容,只将其发送给特定用户或其他什么?

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

1 个答案:

答案 0 :(得分:1)

Clients.All.notifyUpdatedTicket

将向所有客户发送消息。它不会使用此签名调用您的方法(我假设您正在尝试这样做):

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

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

无论如何,如果这样做,您需要在该方法中使用GetHubContext<TicketHub>(),即使它是集线器类的一部分,因为集线器上下文在请求时设置为集线器管道的一部分枢纽到达。没有它,集线器只是一个普通的类,你无法访问动态成员,如Clients

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