2016-10-21 7 views
6

SignalRに接続し、ページ上にリンクを永続的に維持するための正しいJavaScriptパターンは何ですか?人々がコンピュータを休止しているか、複数の永続的シグナル接続のパターン

ドキュメントはちょうど使用言う:

$.connection.hub.start() 
    .done(function(){ console.log('Now connected, connection ID=' + $.connection.hub.id); }) 
    .fail(function(){ console.log('Could not Connect!'); }); 
}); 

しかし、これを考慮に切断やその他の問題を取るようには見えません。

また、セッションの期限切れの問題を検出せず、再ログインが必要です。

+0

この質問は意見に基づいており、スタックオーバーフローのトピックではありません。 –

+0

エラー処理の方法でAPIを呼び出すのは、意見に基づく質問ですか? – Cine

+0

* SignalRに接続する正しいJavaScriptパターンは何ですか?* SignalR(ハブ、永続接続など)に接続するための単一の「正しい」パターンがないため、「最も正しい" –

答えて

1

私がこれを実行できると思う唯一の方法は、接続された各クライアントの接続情報を格納するバックプレーンを使用することです。つまり、彼らは決して「接続し続ける」ことはありません。もし彼らがインターネットや休止状態を失ったら、あなたができるのは「再接続」だけです。切断された場合、継続的に状態情報を保管しなければなりません。 "切断"イベントはそれまでには遅すぎる可能性が高いためです。 1つのオプションは、継続的に状態情報をレディスキャッシュにストリームし、定期的にそれをバックプレーンに、より合理的な間隔で送信することである。

+0

目的は、決して切断することではなく、目標は、再接続する必要がある場合を除いて、切断が見られないようにすることです。 UIがアクティブで、inet接続がある場合はIEに接続されます。 – Cine

+0

このソリューションは、UIの状態を管理していることを確認し、接続を中断した場合にredisキャッシュから引き出すことができると確信しています。 –

+0

UIの状態を管理することは全体的な質問です... – Cine

2

SignalRはコネクションベースのクライアント/サーバソリューションであるため、長い持続的なオープン接続を期待することはできません。だから、Kelso Sharpが答えて書いたように、あなたができる唯一の良いことは接続ライフサイクルの出来事を管理することだけです。

signalR接続のすべてのライフサイクルイベントのドキュメントをチェックアウト: https://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#connectionlifetime

をだから私たちが失敗したことはありません永続的な接続を行う方法についての私達の注意を集中していない場合、我々は代わりに与えるに焦点を当てることができバックグラウンドで切断やリロードなどを巧みに管理することによって、ユーザーにその印象を与えることができます。

ハブをクライアントにプッシュする原因を指定していないにもかかわらず、これを設定する方法を示す図ですが、この図のようなイメージングが可能です。ここでは、同じ状態を何らかの状態プロバイダ(キャッシュ、Web APIストレージなど)にプッシュすることで、任意の時点ですべてのデータを利用できるようにするという考え方です。 uiがロードまたは切断すると、このプロバイダに状態を取り戻す要求が発行され、ハブに再接続する必要があります。

データの一貫性が問題の場合は、状態のバージョニングを行い、uiにローカルコピーを保存してから、再接続時に監査を実行できます。そうすれば、あなたが何かを逃したかどうかを知ることができます。その場合、州の提供者に追いつきのリクエストを出します。

Pattern for faking persistent connection

あなたは自分のクライアント側の一部の機能ではフック持つイベント処理するには: //これは、接続サイクル中に全ての状態変化をトリガしますが:

$.connection.hub.stateChanged(function (change) { 
    if (change.newState === $.signalR.connectionState.reconnecting) { 
     console.log("liveFeed is reconnecting!"); 
    } 
    else if (change.newState === $.signalR.connectionState.connected) { 
     console.log("liveFeed is connected!"); 
    } 
}); 

//これをハブとの接続が切断されたときにトリガーします。セッションを行う方法を考え出した

$.connection.hub.disconnected(function() { 
    console.log('Connection disconnected') 
}); 
+0

'再接続 'に関して' disconnected'が呼び出されたときの詳細はあります。そして、それはいつもの終わりまで再接続を試みることを保証されていますか?もしそうなら、試行の遅れは?そして私はどのようにして強制的に試みることができますかまた、再接続の試みが失敗したという通知を受け取りますか? – Cine

+0

セッションの有効期限を処理する方法は? – Cine

+0

@Cineライフサイクルイベントがすべて表示されているドキュメントをよく読んでいると、それらのイベントが発生したときにトリガすることが期待できます。再試行などに関しては、再試行と再試行との間の遅延で基本的な再試行パターンを試すことができる2つのパターンがあります。再試行が連続して失敗した場合は、遅延を増やすことを強く検討します。または、回路ブレーカーのパターンを試すことができます、それは少し高度です、そして、あなたがこの状況で探しているものではないかもしれません。 – Espen

0

再試行してサーバーへのすべての呼び出しをラップすることにより、有効期限が切れる:これは、閉じた手段が、それが扱われたことをブートストラップモーダルダイアログ#login-dialogがあると仮定し

function callServer(call) { 
    function err(r?: Error) { 
    var output = $.Deferred(); 
    if (r && 
     r.message && 
     (r.message.startsWith("Caller is not authorized to invoke the") || 
      r.message.startsWith("The user identity cannot change during "))) { 
     $('#login-dialog') 
      .one('hide.bs.modal', 
      () => { 
       hub.connection.stop(); 
       $.connection.hub.start() 
        .then(() => hub.server.run(call)) 
        .then(output.resolve, output.reject); 
       }) 
      .modal('show'); 
     return output; 
    } 
    // ReSharper disable once SuspiciousThisUsage 
    return output.rejectWith(this, <any>arguments); 
    } 

    return $.connection.hub.start() 
    .then(() => hub.server.run(call)) 
    .then(null, err); 
} 

再ログイン。

関連する問題