Ядро SignalR - делает недействительными мертвые соединения - PullRequest
0 голосов
/ 07 февраля 2019

Проблема

Я использую .NET Core 2.2 с ASP.NET Core SignalR.В настоящее время я сохраняю все состояния соединения в базе данных SQL (см. в этом документе ; хотя это руководство для "старой" библиотеки SignalR, логика та же).Я также использую объединительную панель Redis, поскольку мое приложение может масштабироваться по горизонтали.

Однако при перезапуске моего приложения текущие соединения не закрываются и теряются.Ранее связанная статья гласит:

Если ваши веб-серверы перестают работать или приложение перезапускается, метод OnDisconnected не вызывается.Поэтому возможно, что в вашем хранилище данных будут записи для идентификаторов соединений, которые больше не действительны.Чтобы очистить эти потерянные записи, вы можете сделать недействительным любое соединение, созданное за пределами периода, который имеет отношение к вашему приложению.

Вопрос

В «старом»В SignalR есть ITransportHeartbeat (который этот скрипт прекрасно реализует), но такого интерфейса для версии .NET Core нет (по крайней мере, я не смог его найти).

Как сделатьЯ знаю, что связь больше не существует?Я хочу (или действительно должен) очистить старые идентификаторы соединений.

1 Ответ

0 голосов
/ 08 февраля 2019

Решение, которое я придумал, заключается в следующем.Это не так элегантно, но пока я не вижу другого варианта.

Я обновил модель в базе данных, чтобы она не только содержала ConnectionId, но и LastPing (тип DateTime),Клиент отправляет сообщение KeepAlive (пользовательское сообщение, не использующее параметры активности активности SignalR).Получив сообщение (на стороне сервера), я обновляю базу данных с текущим временем:

var connection = _context.Connection.FirstOrDefault(x => x.Id == Context.ConnectionId);
connection.LastPing = DateTime.UtcNow;

Чтобы очистить потерянные соединения (которые не удаляются методом OnDisconnected SignalR), у меня есть задачапериодически запускается (в настоящее время в режиме Hangfire), который удаляет соединения, где поле LastPing не было недавно обновлено.

...