9

我有一个 MVC 项目,有多个页面。

我有一个长时间运行的过程,它会更新客户端的进度。但是,此更新仅发送给单个客户端,而不是广播给所有客户端。

Clients.Client(ConnectionId).sendMessage(msg);

在我的 layout.cshtml 中,这是我连接到集线器的方式

    var serverHub = $.connection.notifier;
    window.hubReady = $.connection.hub.start(function () { });

问题是,当我导航到另一个页面时,我不再收到来自 signalr 的消息,因为连接 ID 已更改。

我应该如何解决这个问题,以便我的信号器集线器仍然可以将消息发送到单个客户端,而客户端从一个页面导航到另一个页面。

4

1 回答 1

8

您将需要创建用户到连接 ID 的服务器映射。请参阅:SignalR 1.0 beta 连接工厂

您将希望让您的用户在 OnDisconnected 事件之后持续存在,并且当他们使用不同的连接 Id 连接时,您可以继续向他们发送数据。

所以思考过程可能如下:

  1. 页面加载,SignalR 连接被实例化
  2. 连接完全启动后,调用 => TryCreateUser(返回用户,无论它是否存在或已创建)。
  3. 长时间运行的过程开始
  4. 客户端更改页面 -> SignalR 连接停止
  5. 新页面加载,新 SignalR 连接被实例化
  6. 连接完全启动后,查看您是否有 cookie、会话或某种类型的数据来代表您的身份 => TryCreateUser(userData)(返回您在最后一页创建的用户)。
  7. 数据继续向用户输送。

注意:如果您采用身份验证方法,则必须在开始连接之前进行身份验证,并且该数据在 SignalR 连接的生命周期内不能更改,它只能在连接处于断开状态时创建/修改。

于 2013-04-18T23:57:12.980 回答