4

asp.net mvc 4 プロジェクトに埋め込まれたチャットを作成しています。OnConnected でユーザーを追加し、OnDisconnected で削除するオンライン ユーザー ul リストがあります。

したがって、私のアプリは SinglePage アプリではありません。つまり、常にページが更新されます。

ページが更新されるたびに Signalr が OnDisconnected と OnConnected を呼び出すため、クライアント側でこのオンライン ユーザー リストを処理する際に問題が発生しています。

他のクライアントがアプリで正常にナビゲートしている間、ページが更新されるたびに削除および追加され続けます。

クライアントでこの動作を回避するにはどうすればよいですか?


usersOnlineリストでページを実行しているクライアントで、このようなことをしようとしています...

var timeout;

chat.client.login = function (chatUser) {
    addUser(chatUser);
    window.clearTimeout(timeout);
};

chat.client.logout = function (chatUser) {
    timeout = setTimeout(function () { removeUser(chatUser.Id); }, 3000);
};

しかし、マルチユーザーのシナリオに対処するのに苦労しています...タイムアウトが実行される前に複数のユーザーがハブ onDisconnected を実行すると、2 番目のユーザーが最初のインスタンスをオーバーライドするためです。

4

1 に答える 1

3

これを回避する実際の方法は実際にはありません。クライアントは、ページを離れるときに常に切断され、次のページが読み込まれるときに SignalR に再度接続します。

これを回避する唯一の方法は、SPA を作成することです。そのため、移動して SignalR を切断する必要はありません。

SignalR ハブのアイデアを使用することは、最小限のプログラミングまたは複雑さでリアルタイム アクションを可能にすることです。SignalR は、アクティブな接続ではなく、現在ログインしているユーザーのリストからプルすることです。同じユーザーが複数いる可能性があるためです。回。

OnConnectedしたがって、 andの代わりに、andのメソッドOnDisconnectedに入れることをお勧めします。例えば:AccountControllerLogInLogOut

public ActionResult LogIn()
{
    //other stuff
    var hub = GlobalHost.ConnectionManager.GetHubContext</*Hub Title*/>();
    hub.client.chat.login()
}

public ActionResult LogOut()
{
    // other stuff
    var hub = GlobalHost.ConnectionManager.GetHubContext</*Hub Title*/>();
    hub.client.chat.logout()
}
于 2014-02-17T19:50:13.027 に答える