この問題は、これまでどのブラウザーにも実装されていない将来のChannel Messaging仕様で対処するのが最善ですが、Alex Ford が説明したように接続数を制限し、localStorage
タブ間のメッセージ バスとして使用することで解決できました。 .
このstorage
イベントを使用すると、1 つの SignalR 接続を開いたままにして、タブ間でデータを伝達できます (それにより、接続の飽和を防ぎます)。呼び出すlocalStorage.setItem('sharedKey', sharedData)
と、storage
他のすべてのタブ (呼び出し元ではない) でイベントが発生します。
$(window).bind('storage', function (e) {
var sharedData = localStorage.getItem('sharedKey');
if (sharedData !== null)
console.log(
'A tab called localStorage.setItem("sharedData",'+sharedData+')'
);
});
重複した呼び出しif ($.connection.hub.state === 1)
を防ぐために、特定のタブが localStorage (Alex の好意による) を介して他のタブに通知する必要があるかどうかをテストして判断できます。localStorage.setItem
Facebook は、いくつかのサブドメインで永続的な接続を提供することにより、このブラウザーの制限を克服していますが、これにより展開とテストが複雑になる可能性があります。
注意事項
古い接続:アレックスのソリューションでは、呼び出されないように注意する必要がありDisconnect()
(例外など)、HubConnections
バケット (またはリポジトリ) が古いハブ接続でいっぱいになります。セッション ID が変更されない (発生する可能性がある) 場合、アクティブなクライアントがなくても、新しいクライアントが SignalR 接続を確立できない可能性があります。または、新しい接続にタイムスタンプを設定し、潜在的な影響を最小限に抑えるために有効期限をスライドさせます。
ロック: ここで説明されているlocalStorage
ようにロックを実装していないため、競合状態になる可能性があります。
さまざまなタイプのイベントをサポートするには、JSON メッセージでeventTypeをエンコードし、storage
イベントでテストする必要があります。
フォールバック
SignalR 接続を確立できない場合は、フォールバックして 45 秒ごとにサーバーをポーリングし、通知カウントを取得します。
localStorage を使用したくない場合は、Cookie を使用できますが、クリーンではありません。