Ошибка: сервер вернул ошибку при закрытии: сервер приложений в настоящее время не подключен к службе Azure '@aspnet/signalr
У меня есть MXChip, который отправляет данные в концентратор IoT Azure, оттуда я использую функцию Azure с привязкой Azure SignalR для отправки данных устройства в Azure Signal R. У меня есть клиент Angular, который получает информацию о соединении, вызывая Созданная мной функция согласования Azure с использованием пакета @aspnet/signalr
,
Но проблема в том, что мой клиент Angular выдает ошибку каждые несколько секунд, и когда я проверяю, я мог понять, что hubConnection.onclose
событие начинается каждые несколько секунд.
Ниже мой сервисный код Angular.
export class SignalRService {
mxChipData: Subject < string > = new Subject();
private hubConnection: SignalR.HubConnection;
constructor(private http: HttpClient) {}
private getSignalRConnection(): Observable < SignalRConnection > {
return this.http.get < SignalRConnection > (`${environment.baseUrl}negotiate`);
}
init() {
this.getSignalRConnection().subscribe(con => {
const options = {
accessTokenFactory: () => con.accessToken
};
this.hubConnection = new SignalR.HubConnectionBuilder()
.withUrl(con.url, options)
.configureLogging(SignalR.LogLevel.Information)
.build();
this.hubConnection.on('notify', data => {
this.mxChipData.next(data);
});
this.hubConnection.start()
.catch(error => console.error(error));
this.hubConnection.onclose((error) => {
console.error(`Something went wrong: ${error}`);
});
});
}
}
Есть ли способ, которым я могу избавиться от этого поведения?
1 ответ
Я понял, легко исправить. SignalR.HubConnection
имеет свойства serverTimeoutInMilliseconds
а также keepAliveIntervalInMilliseconds
,
serverTimeoutInMilliseconds
Тайм-аут сервера в миллисекундах.
Если этот тайм-аут истекает без получения каких-либо сообщений от сервера, соединение будет прервано с ошибкой. Значение времени ожидания по умолчанию составляет 30 000 миллисекунд (30 секунд).
keepAliveIntervalInMilliseconds
Интервал по умолчанию для проверки связи с сервером.
Значение по умолчанию составляет 15 000 миллисекунд (15 секунд). Позволяет серверу обнаруживать жесткие отключения (например, когда клиент отключает компьютер от сети).
Я просто установил эти значения на большее число.
this.hubConnection.serverTimeoutInMilliseconds = 300000;
this.hubConnection.keepAliveIntervalInMilliseconds = 300000;
Мы также можем запустить Hub снова в onclose
событие как временное решение.
this.hubConnection.onclose((error) => {
this.hubConnection.start();
console.error(`Something went wrong: ${error}`);
});
Привет. Используется тот же подход, чтобы не получить эту ошибку, но когда я использовал этот подход, мое соединение не начиналось с этого подхода. Я отлаживаю свой отладчик, а не запускаю соединение.Вот мой код.
connection.serverTimeoutInMilliseconds = 300000;
connection.keepAliveIntervalInMilliseconds = 300000;
connection.onclose((error) => {
connection.start({ transport: 'longPolling' }, function () {
console.log('connection started!');
});
console.error(`Something went wrong: ${error}`);
});
connection.on("iotMessage", function (messageFromIoTDevice) {
document.getElementById("message").innerHTML = messageFromIoTDevice;
});
Пожалуйста, проверьте, что я делаю не так