#c# #websocket #signalr #signalr-hub
#c# #websocket #signalr #signalr-концентратор
Вопрос:
У меня есть несколько страниц, которые используют SignalR. На каждой странице есть 3 группы. Я пытался сохранить запись в базе данных о количестве клиентов для каждой группы. Проблема в том, что количество клиентов в комнатах становится отрицательным числом.
Таблица базы данных выглядит следующим образом: имя_группы nvarchar(10) PK, число int не равно нулю
В моем классе Hub я использую OnConnected() и OnDisconnected() для управления количеством.
public override Task OnConnected()
{
string mAsset1 = Context.QueryString["asset1"];
string mAsset2 = Context.QueryString["asset2"];
string body = "{0}/{1}";
string groupName = string.Format(body, mAsset1, mAsset2);
JoinRoom(groupName);
SignalRClientCountCrud.AddToClientCounter(groupName); //UPDATING DATABASE
return base.OnConnected();
}
public override Task OnDisconnected(bool stop)
{
string mAsset1 = Context.QueryString["asset1"];
string mAsset2 = Context.QueryString["asset2"];
string body = "{0}/{1}";
string groupName= string.Format(body, mAsset1, mAsset2);
SignalRClientCountCrud.RemoveFromClientCounter(groupName); //UPDATING DATABASE
return base.OnDisconnected(stop);
}
public Task JoinRoom(string groupName)
{
Task result = Groups.Add(Context.ConnectionId, groupName);
return resu<
}
Добавление и удаление количества клиентов из базы данных (методы, которые я вызываю в классе Hub)
public static void AddToClientCounter(string roomName)
{
List<string> rooms = GetRooms(roomName);
using (DatabaseEntities db = DbManager.Get())
{
foreach (string room in rooms)
{
SignalRClientCount group = db.SignalRClientCounts.Where(c => c.GroupName == room).FirstOrDefault();
if (group != null)
{
group.ClientCount ;
}
else
{
SignalRClientCount signalRGroupCount = new SignalRClientCount();
signalRGroupCount.GroupName = room;
signalRGroupCount.ClientCount = 1;
db.SignalRClientCounts.Add(signalRGroupCount);
}
db.SaveChanges();
}
}
}
public static void RemoveFromClientCounter(string roomName)
{
List<string> rooms = GetRooms(roomName);
using (DatabaseEntities db = DbManager.Get())
{
foreach (string room in rooms)
{
SignalRClientCount group = db.SignalRClientCounts.Where(c => c.GroupName == room).FirstOrDefault();
if (group != null)
{
group.ClientCount--;
db.SaveChanges();
}
}
}
}
Иногда в группе базы данных X будет иметь значение -5.