2013-02-18 55 views
7

私のアプリケーションでSignalRを使用しています。私はOnDisconnected()が正しく呼び出されていることに非常に大きく依存するアプリケーションを持っています。そして、それは次のような状況の下で正しく呼び出されます。SignalRの切断がインターネットの切断/再接続で呼び出されない

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

を閉じ、ネットワーク接続が突然低下した場合は呼び出されません。たとえば、クライアントマシンのネットワークケーブルを外したり、クライアントのワイヤレスネットワークを無効にしたり、ルータの電源コードを抜いたりすると、数分間待機してもOnDisconnected()が呼び出されることはありません。

+0

私はSignalRをそれほど扱っていますが、ユーザーがまだハブに接続しているかどうかを確認するには、その機能性のどれもチェックしていません。 (x)分後にユーザーをログアウトする独自のタイマーを実装することができます。 – Timsen

+0

このリンクを参照してください、あなたに役立つかもしれません:http://www.dotnetcurry.com/ShowArticle.aspx?ID=826 – Timsen

答えて

6

接続が切断されますが、直ちに接続されません。クライアントの接続が切断されたとみなす前に、SignalRが待機する(デフォルトのTCP接続がなくなった直後ではない)ため、しきい値(デフォルトでは30秒)が設定可能です。設定されたタイムアウト前に接続が切断されて再接続された場合、OnDisconnectedは発生しません。

しばらく待ってから何らかのシナリオで育ったことがない人は、バグかもしれません。 SignalR 1.0は今日リリースされましたので、私もあなたもそれを試してみて、問題がまだ見えるかどうか確認してください。

+0

ありがとうdfowler..iは信号r 1.0を使用します、今私は信号rを使用しています0.5.3 – user1527989

+1

David、「HttpContext.Response.ClientDisconnectedToken'は、我々がASP.NET 4.5 + IIS 8.0でSignalRをホストしている時に授与されますか? – tugberk

+2

バグがあるので使用しません。しかし、それが固定されたら、我々はそれを使用します。 – davidfowl

2

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

SignalRはそれを追跡しないので、あなたは接続が切断されたときにOnDisconnectedイベントが突然解雇見ることはできません(それはバックグラウンドタスクとの接続用のプールを使用して、一定の間隔内で接続が停止しているかどうかを確認します)。ブラウザを閉じると、私はSignalRがサーバーに切断イベントを通知する要求を送信していると推測しています。そういうわけで、あなたは突然イベントが起こるのを見ているのです。

ただし、ASP.NET 4.5にはCancellationTokenというClientDisconnectedTokenという名前のプロパティがあります。これはHttpContext.Responseに対して、TCP接続を切断したときに通知されます。これは私が知る限りIIS 8.0でのみ動作し、SignalRが.NET 4.5 ASP.NETホストの下で動作するかどうかはわかりません。

関連する問題