7

さまざまな理由から、SignalR 接続が確立されたときに、その ConnectionId をデータストアに保存しています。ただし、これらの接続レコードは、たとえば、SignalR が再起動した場合に孤立する可能性があります。(私は OnDisconnected() が正しく呼び出されているかどうか疑問に思う動作も観察しましたが、これについてはよくわかりません。)

しかし、何らかの理由で、孤立したデータベースのレコードが定期的に発生します。それらを整理し、実際には接続されていないリストされている ConnectionID を削除できるようにしたいと考えています。この ConnectionID はまだライブ セッションに関連付けられています。

私は SignalR のソースに目を通しましたが、これを達成する最善の方法を思いつきませんでした。それを行うための合理的な方法はありますか?

4

3 に答える 3

3

これを達成する方法は、自分でクライアントを追跡することです。あなたの投稿から、あなたはすでにこれを行っているように見えますが (そうでない場合でもコードが提供されています)、これがクライアントが接続されているかどうかを知る唯一の方法です。SignalR サーバーは、クライアントが接続されているかどうかを示す方法として、onconnected/ondisconnected イベントをトリガーします。

再接続時にデータベース内のレコードを再インスタンス化しないことを確認することをお勧めします。

たとえば(非常に単純な例):

class myHub
{
    private static List<String> _connectedClients = new List<String>();

    public override Task OnConnected()
    {
        _connectedClients.Add(Context.ConnectionId);
        return base.OnConnected();
    }

    public override Task OnDisconnected()
    {
        _connectedClients.Remove(Context.ConnectionId);
        return base.OnDisconnected();
    }

    public static bool IsConnected(string cid)
    {
        return _connectedClients.Contains(cid);
    }
}

ハブで IsConnected を呼び出して、接続 ID が現在接続されているかどうかを判断できるようになりました。

于 2013-01-03T04:37:16.537 に答える
0

それは私にも起こります.時々孤立した接続を検出します.

回避策として、クライアント側の関数 $(window).unload を追加しました。これは、切断が本来行うべきことを行うサーバー側の関数を呼び出します。

それが役に立てば幸い。

于 2013-01-23T08:05:11.210 に答える
-1

connectionId を DB に保存するのは良い方法ではありません。SignalR は、各ページに新しい ID を割り当てます。Kevin W. Griffin のこのサンプルを試してください

于 2013-01-08T06:35:14.713 に答える