Решение, которое я придумал, заключается в следующем.Это не так элегантно, но пока я не вижу другого варианта.
Я обновил модель в базе данных, чтобы она не только содержала ConnectionId
, но и LastPing
(тип DateTime
),Клиент отправляет сообщение KeepAlive
(пользовательское сообщение, не использующее параметры активности активности SignalR).Получив сообщение (на стороне сервера), я обновляю базу данных с текущим временем:
var connection = _context.Connection.FirstOrDefault(x => x.Id == Context.ConnectionId);
connection.LastPing = DateTime.UtcNow;
Чтобы очистить потерянные соединения (которые не удаляются методом OnDisconnected
SignalR), у меня есть задачапериодически запускается (в настоящее время в режиме Hangfire), который удаляет соединения, где поле LastPing
не было недавно обновлено.