我有一个MVC项目,有多个页面。
我有一个长时间运行的进程,它更新客户端的进度。但是,此更新仅发送到单个客户端,而不是广播到所有客户端。
Clients.Client(ConnectionId).sendMessage(msg);
在我的布局。cshtml,这是我如何连接到集线器
var serverHub = $.connection.notifier;
window.hubReady = $.connection.hub.start(function () { });
问题是,当我导航到另一个页面时,我不再收到来自signalr的消息,因为连接id已经更改。
我应该如何解决这个问题,这样我的信号中心仍然可以向单个客户端发送消息,而客户端从一个页面导航到另一个页面。
您将需要创建用户到连接id的服务器映射。参见:SignalR 1.0 beta连接工厂。
你会想让你的用户在OnDisconnected事件之后继续存在,当他们使用不同的连接Id连接时,你可以继续向他们发送数据。
所以思考过程可以如下:
- 页面加载,SignalR连接实例化
- 一旦连接完全启动调用=> TryCreateUser(返回一个用户,无论它是存在的还是创建的)。
- 长时间运行的进程启动
- 客户端更改页面-> SignalR连接停止
- 新的页面加载,新的SignalR连接实例化
- 一旦连接完全启动,看看你是否有一个cookie,会话,或一些类型的数据代表你是谁=> TryCreateUser(userData)(返回你在上一页创建的用户)。
- 数据继续向用户发送。
注意:如果您采用身份验证方法,则必须在启动连接之前进行身份验证,并且在SignalR连接的生命周期内数据不能更改,它只能在连接处于断开状态时创建/修改。