1

我正在创建一个单页 Web 应用程序,它使用 SignalR 来通知服务器上的更改。我是 SignalR 的新手,并试图了解如何让客户端仅根据它们所在的视图来监听某些事件。例如,如果用户正在查看客户信息,那么他们希望在此数据发生更改时得到通知,但是如果他们没有查看此数据,则无需通知任何更改。

我认为当我不再需要了解来自该中心的信息时,我可以使用中心代理并取消订阅或断开连接。以下是我尝试实现这一目标的方法:

var connection = $.hubConnection();
var proxy = connection.createHubProxy(hubName);

// When I want to receive notifications I subscribe to the event
proxy.on('CustomerChanged', function() { ... });

// When I want to stop receiving notifications
proxy.off('CustomerChanged');

这确实会停止调用事件处理程序,但是查看提琴手,即使处理程序已关闭,数据仍会发送到浏览器。

有没有办法停止在客户端监听通知,以便服务器甚至不会发送任何数据?

提前致谢

4

1 回答 1

2

使用组。

在您的 Hub 中,您可以非常轻松地将用户添加到组中。这是通过集线器上的 OnConnected 方法的示例(可以随时随地完成):

public override Task OnConnected()
{
    Groups.Add(Context.ConnectionId, "foo");

    return base.OnConnected();
}

然后,您可以轻松地从组中删除用户。通过 OnDisconnected 方法的示例(可以随时随地完成):

public override Task OnDisconnected()
{
    Groups.Remove(Context.ConnectionId, "foo");

    return base.OnDisconnected();
}

最后,您可以通过以下方式向订阅组的所有客户端发送数据:

Clients.Group("foo").bar();

因此,对于您的用例,当您希望通知一个用户或一组用户时,将他们添加到一个组中,这样当数据发送到该组时,他们就会收到它;当他们不应再接收特定组的数据时,将其从中删除。

希望这可以帮助!

于 2013-10-28T07:17:50.620 回答