Signalr无法向特定用户发送消息

3

我在我的中央处理器内部有一个用于向特定客户端发送更新票据的方法。但是我希望它发送到控制器内部的服务器和特定的用户,您可以看到我以下面的方式实现:

我正在使用以下方法向特定客户端发送更新消息:

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中的类相同。

但是,我传递了一个别名列表而不是一个用户,并获取他们的连接并将其发送到他们的连接ID。

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

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

当我使用特定的OpenedBy和AssignedTo发送上述命令时,它会发送给所有用户,而不应该这样做。
我在调用控制器时是否漏掉了只发送给特定用户的内容?
即使我直接将人员别名放入hub方法中,它仍然会发送给每个人。我认为这与控制器方法有关。

这个没有人知道吗? - Lucas
1个回答

1

这个

Clients.All.notifyUpdatedTicket

将向所有客户端发送一条消息。它不会调用您使用此签名的方法(我假设这就是您想要做的)。
public void NotifyUpdatedTicket(Ticket ticket, string note, params string[] aliases)

我假设这是您在hub类中添加的方法。如果它们唯一的目的是从服务器端调用,则将方法放在hub类中不是一个好主意。
无论如何,如果您这样做,即使它是hub类的一部分,也需要在该方法内使用GetHubContext<TicketHub>(),因为当请求到达该hub时,hub上下文将作为hub管道的一部分设置。没有这个,hub就只是一个普通的类,您无法访问动态成员,如Clients
总之,看起来您对一些基础知识感到困惑。我建议将NotifyUpdatedTicket移动到一个单独的类中,该类还缓存相关的hub上下文,然后在需要时调用该方法(例如,从MVC控制器方法调用)。

在教程http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#inmemory中,它展示了从C#方法将其发送给客户端。不确定我是否理解你的意思。 - Lucas
它从hub方法发送到客户端,是的(SendChatMessage),但您正在使用GetHubContext从其他地方调用(我不知道那段代码在哪里); 在他们的示例中,客户端正在调用SendChatMessage,然后该方法传播到其他客户端; 在您的示例中,您正在尝试从服务器启动(我想;不完全清楚GetHubContext <TicketHub>()。Clients.All ...调用在哪里); 我的意思是以GlobalHost开头的行将直接调用所有客户端,而不是迭代别名的帮助程序方法。 - Lars Höppner
我明白你的意思了。现在似乎可以工作了。非常感谢! - Lucas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接