ここに私のハブがあります:
[HubName("marketWatch")]
public class MarketWatchHub : Hub
{
public override Task OnConnected()
{
SocketCommunicator.Instance.UserConnected(Context.ConnectionId, Context.User.Identity.Name);
return base.OnConnected();
}
public override Task OnDisconnected()
{
SocketCommunicator.Instance.UserDisconnected(Context.ConnectionId);
return base.OnDisconnected();
}
public override Task OnReconnected()
{
// TODO: implement...
return base.OnReconnected();
}
public List<MarketDataResponse> GetAllMarketWatchData()
{
return SocketCommunicator.Instance.MarketDataList;
}
}
そして、これが SocketCommunicator クラスの簡略化されたバージョンです:
public class SocketCommunicator
{
private static SocketCommunicator _Instance = new SocketCommunicator();
public static SocketCommunicator Instance
{
get { return SocketCommunicator._Instance; }
}
private Socket socket { get; set; }
private readonly object lockObj = new object();
private IHubContext hubContext;
private List<UserDetail> connectedUsers;
public List<MarketDataResponse> MarketDataList;
private SocketCommunicator() { }
public void UserConnected(string connectionId, string username)
{
lock (lockObj)
{
connectedUsers.Add(new UserDetail() { ConnectionId = connectionId, UserName = username });
}
}
public void UserDisconnected(string connectionId)
{
lock (lockObj)
{
connectedUsers.RemoveAll(ud => ud.ConnectionId == connectionId);
}
}
public void GetMarketData()
{
// Do something and set this.MarketDataList
}
}
F5 キーを押してアプリケーションをデバッグすると、魅力的に機能します。ユーザーがログインすると、ハブの OnConnected メソッドが呼び出され、ユーザーがログオフすると OnDisconnected メソッドが呼び出されます。ただし、ユーザーがログインしてブラウザを閉じると、OnDisconnected メソッドは呼び出されません。これは、実際には接続されていない膨大な数の UserDetail オブジェクトが、そのうち、connectedUsers リストに含まれることになることを意味します。どうすればこの状況を回避できますか? ユーザーと接続 ID の関連付けを保存するより良い方法はありますか?
前もって感謝します、