Я пишу промежуточное ПО, используя сервер веб-сокетов aspnet core 2.1 и клиентские API.Все работает очень хорошо, но я хотел бы, чтобы некоторые рекомендации по передовой практике для серверной стороны завершали работу клиента веб-сокета, который считается не отвечающим.
Клиент посылает сердцебиение каждые (скажем) 5 секунд.У меня есть таймер на стороне сервера, который запускает и проверяет, чтобы убедиться, что клиент отправил сердцебиение в пределах интервала ожидания сердцебиения (например, 2 * интервал сердцебиения, скажем, таймер срабатывает каждые 10 секунд).
Если интервал имеетпревышен, я хочу, чтобы сервер разорвал соединение с клиентом.Внутри обратного вызова таймера у меня есть этот код:
var span = DateTime.Now - lastHeartbeat;
// No heartbeat within the configured limit, declare the client dead.
if (span.TotalMilliseconds > HEARTBEAT_TIMEOUT)
{
if (_websocket.State == WebSocketState.Open)
{
heartbeatTimer.Change(Timeout.Infinite, Timeout.Infinite); // stop the timer
Console.WriteLine($"client: {ID} heartbeat interval expried, client is unresponsive, closing the websocket");
await _websocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "client is unresponsive", CancellationToken.None);
}
}
Мой код прослушивателя сервера веб-сокетов находится в попытке / перехвате / наконец, поэтому, когда произойдет завершение, я смогу чисто завершить работу.
Я не смог найти ничего в официальных документах Microsoft о сервере, завершающем работу клиента.Ищу совет.Это адекватный подход?