Ошибка: сервер вернул ошибку при закрытии: сервер приложений в настоящее время не подключен к службе 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;
});

Пожалуйста, проверьте, что я делаю не так

Попробуйте переключить режим обслуживания SignalR на бессерверный (или классический)

Другие вопросы по тегам