Asp.net

在不同頁面導航時重用 signalR 中的相同連接

  • October 30, 2015

我有一個 MVC 項目,有多個頁面。

我有一個長時間執行的過程,它會更新客戶端的進度。但是,此更新僅發送給單個客戶端,而不是廣播給所有客戶端。

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

在我的 layout.cshtml 中,這是我連接到集線器的方式

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

問題是,當我導航到另一個頁面時,我不再收到來自 signalr 的消息,因為連接 ID 已更改。

我應該如何解決這個問題,以便我的信號器集線器仍然可以向單個客戶端發送消息,而客戶端在頁面之間導航。

您將需要創建使用者到連接 ID 的伺服器映射。請參閱:SignalR 1.0 beta 連接工廠

您將希望讓您的使用者在 OnDisconnected 事件之後持續存在,並且當他們使用不同的連接 Id 連接時,您可以繼續向他們發送數據。

所以思考過程可能如下:

  1. 頁面載入,SignalR 連接被實例化
  2. 連接完全啟動後,呼叫 => TryCreateUser(返回使用者,無論它是否存在或已創建)。
  3. 長時間執行的過程開始
  4. 客戶端更改頁面 -> SignalR 連接停止
  5. 新頁面載入,新 SignalR 連接被實例化
  6. 連接完全啟動後,查看您是否有 cookie、會話或某種類型的數據來代表您的身份 => TryCreateUser(userData)(返回您在最後一頁創建的使用者)。
  7. 數據繼續向使用者輸送。

**注意:**如果您採用身份驗證方法,則必須在開始連接之前進行身份驗證,並且該數據在 SignalR 連接的生命週期內不能更改,它只能在連接處於斷開狀態時創建/修改。

引用自:https://stackoverflow.com/questions/16077519