Вопрос не проясняет, используется ли старый SignalR или ASP. NET Core SignalR. ASP. NET Core SignalR был полностью переписан.
Текущий клиент Javascript, @ microsoft / signalr поддерживает автоматизированный c переподключение . Все, что вам нужно сделать, это добавить .withAutomaticReconnect()
при создании соединения с концентратором:
const connection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub")
.withAutomaticReconnect()
.build();
Обновление
Статья , объясняющая, как работает @ microsoft / signalr очень очень тщательно. В разделе Reconnect клиентов объясняется:
- , как включить автоматическое c переподключение с помощью простого
.withAutomaticReconnect()
- , как настроить количество повторов и задержек между ними, передав массив времени задержки
withAutomaticReconnect
, например: .withAutomaticReconnect([0, 0, 10000])
. По умолчанию это [0, 2000, 10000, 30000]
в общей сложности 42 секунды. - вместо массива задержек может использоваться обратный вызов:
.withAutomaticReconnect({
nextRetryDelayInMilliseconds: retryContext => {
if (retryContext.elapsedMilliseconds < 60000) {
// If we've been reconnecting for less than 60 seconds so far,
// wait between 0 and 10 seconds before the next reconnect attempt.
return Math.random() * 10000;
} else {
// If we've been reconnecting for more than 60 seconds so far, stop reconnecting.
return null;
}
}
})
- как обрабатывать события
onreconnecting
и onreconnected
и, возможно, ведение журнала или отображение уведомления пользовательского интерфейса:
connection.onreconnecting((error) => {
console.assert(connection.state === signalR.HubConnectionState.Reconnecting);
document.getElementById("messageInput").disabled = true;
const li = document.createElement("li");
li.textContent = `Connection lost due to error "${error}". Reconnecting.`;
document.getElementById("messagesList").appendChild(li);
});
- Что делать в случае сбоя переподключения. В этом случае
onclose
срабатывает и может использоваться для повторного подключения:
connection.onclose(async () => {
await start();
});