現在、ユーザーを OnlineUsers というテーブルに保存しています。人が接続または切断すると、ユーザーIDと彼の接続IDがテーブルに追加されますが、何らかの理由で(複数のブラウザーウィンドウが開いていると思います)、切断機能が起動しないことがあり、ユーザーがテーブルに残り、「オンライン」に表示されます」 彼らが本当にそうでないとき。以前にこの問題に遭遇した人はいますか?この問題を解決する良い方法は何ですか?
更新** (コードを入れなくてすみません、最初からやるべきでした)
テーブルに追加および削除するdb関数は次のとおりです。
public bool ConnectUser(Guid UserId, String ConnectionId)
{
if (!Ent.OnlineUsers.Any(x => x.UserId == UserId && x.ConnectionId == ConnectionId))
{
Ent.OnlineUsers.AddObject(new OnlineUser { UserId = UserId, ConnectionId = ConnectionId });
Ent.SaveChanges();
return true;
}
else
return false;
}
public void DisconnectUser(Guid UserId, String ConnectionId)
{
if (Ent.OnlineUsers.Any(x => x.UserId == UserId && x.ConnectionId == ConnectionId))
{
Ent.OnlineUsers.DeleteObject(Ent.OnlineUsers.First(x => x.UserId == UserId && x.ConnectionId == ConnectionId));
Ent.SaveChanges();
}
}
これが私のハブクラスの接続および切断タスクです。
public Task Disconnect()
{
disconnectUser();
return null;
}
public Task Reconnect(IEnumerable<string> connections)
{
connectUser();
return null;
}
public Task Connect()
{
connectUser();
return null;
}
private void connectUser()
{
if (onlineUserRepository.ConnectUser(MainProfile.UserId, Context.ConnectionId))
{
Groups.Add(Context.ConnectionId, Convert.ToString(MainProfile.ChatId));
}
}
private void disconnectUser()
{
onlineUserRepository.DisconnectUser(MainProfile.UserId, Context.ConnectionId);
Groups.Remove(Context.ConnectionId, Convert.ToString(MainProfile.ChatId));
}
signalR の最新バージョン (0.5.3) を使用していることを確認しました。これは、複数のブラウザー ウィンドウを開いているときにそれらをすべて一度に閉じると、ユーザーがデータベースでスタックしてしまうようです。
これが必要な場合、これは私の Connection Id Generator クラスです:
public class MyConnectionFactory : IConnectionIdGenerator
{
public string GenerateConnectionId(IRequest request)
{
if (request.Cookies["srconnectionid"] != null)
{
return request.Cookies["srconnectionid"].ToString();
}
return Guid.NewGuid().ToString();
}
}