断开SignalR中的集线器

时间:2013-10-28 06:55:07

标签: asp.net-mvc-4 signalr

我正在创建一个单页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');

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

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

提前致谢

1 个答案:

答案 0 :(得分:2)

使用群组。

在您的中心中,您可以非常轻松地将用户添加到群组中。以下是通过集线器上的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();

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

希望这有帮助!