7

私は自分のアプリでSignalRを使用していOnDisconnected()ます。正しく呼び出されることに非常に大きく依存するアプリがあります。また、次の状況では正しく呼び出されます。

 public Task OnDisconnected()
 {
     try
     {
        DeleteUser(Context.ConnectionId);
        return null;
     }
     catch (Exception ex)
     {
        return null;
     }
}
  1. ユーザーがページを更新します
  2. ユーザーは新しいページに移動します
  3. ユーザーがブラウザを閉じます

ただし、ネットワーク接続が突然切断された場合は呼び出されません。たとえば、クライアントマシンのネットワークケーブルを抜いたり、クライアントのワイヤレスネットワークを無効にしたり、ルーターを抜いたりするOnDisconnected()と、数分待っても呼び出されません。

4

2 に答える 2

6

切断された状態になりますが、すぐには発生しません。SignalRがクライアントが切断されたと見なす前に(基盤となるtcp接続が切断され、これも即時ではない場合)待機するしきい値(デフォルトでは30秒)を構成できます。設定されたタイムアウトの前に接続が切断されて再接続された場合、OnDisconnectedは発生しません。

しばらく待っても、あるシナリオで発生するのが見られない場合は、バグである可能性があります。SignalR 1.0は本日リリースされたので、それも試してみて、まだ問題が発生するかどうかを確認することをお勧めします。

于 2013-02-18T22:02:11.957 に答える
2

これは正しい答えではないかもしれませんが、これは私が知っていることです:

OnDisconnectedSignalR はそれを追跡しないため、接続が切断されたときに突然発生したイベントを確認することはできません (バックグラウンド タスクとの接続をプールして、特定の間隔内で接続が切断されているかどうかを確認します)。ブラウザーを閉じると、SignalR がサーバーに要求を送信して切断イベントを通知していると思います。そのため、イベントが発生したことが突然表示されます。

ただし、ASP.NET 4.5 には、TCP 接続が切断されたときに通知される、呼び出されるCancellationTokenプロパティがあります。私の知る限り、これは IIS 8.0 でのみ機能し、.NET 4.5 ASP.NET ホストで SignalR がこれで機能するかどうかはわかりません。ClientDisconnectedTokenHttpContext.Response

于 2013-02-18T13:53:03.430 に答える