Error: Server returned an error on close: No app server is currently connected to the Azure service '@aspnet/signalr
Error: Server returned an error on close: No app server is currently connected to the Azure service '@aspnet/signalr
我有一个 MXChip,它将数据发送到 Azure IoT 中心,从那里我使用 Azure Functions 和 Azure SignalR 绑定到 post 设备数据到 Azure Signal R。我有一个 Angular 客户端将通过调用我创建的 Azure Negotiate 函数获取连接信息,使用包 @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}`);
});
});
}
}
有什么办法可以摆脱这种行为?
我找到了一个简单的解决方法。 SignalR.HubConnection
具有属性 serverTimeoutInMilliseconds
和 keepAliveIntervalInMilliseconds
。
serverTimeoutInMilliseconds
服务器超时(以毫秒为单位)。
如果超过此超时时间仍未收到来自服务器的任何消息,连接将因错误而终止。默认超时值为 30,000 毫秒(30 秒)。
keepAliveIntervalInMilliseconds
ping 服务器的默认时间间隔。
默认值为 15,000 毫秒(15 秒)。允许服务器检测硬断开连接(比如当客户端拔掉他们的计算机时)。
我只是将这些值设置为更大的数字。
this.hubConnection.serverTimeoutInMilliseconds = 300000;
this.hubConnection.keepAliveIntervalInMilliseconds = 300000;
我们也可以在 onclose
事件中再次启动集线器作为临时修复。
this.hubConnection.onclose((error) => {
this.hubConnection.start();
console.error(`Something went wrong: ${error}`);
});
尝试将 SignalR 服务模式切换为无服务器(或经典)
我有一个 MXChip,它将数据发送到 Azure IoT 中心,从那里我使用 Azure Functions 和 Azure SignalR 绑定到 post 设备数据到 Azure Signal R。我有一个 Angular 客户端将通过调用我创建的 Azure Negotiate 函数获取连接信息,使用包 @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}`);
});
});
}
}
有什么办法可以摆脱这种行为?
我找到了一个简单的解决方法。 SignalR.HubConnection
具有属性 serverTimeoutInMilliseconds
和 keepAliveIntervalInMilliseconds
。
serverTimeoutInMilliseconds
服务器超时(以毫秒为单位)。
如果超过此超时时间仍未收到来自服务器的任何消息,连接将因错误而终止。默认超时值为 30,000 毫秒(30 秒)。
keepAliveIntervalInMilliseconds
ping 服务器的默认时间间隔。
默认值为 15,000 毫秒(15 秒)。允许服务器检测硬断开连接(比如当客户端拔掉他们的计算机时)。
我只是将这些值设置为更大的数字。
this.hubConnection.serverTimeoutInMilliseconds = 300000;
this.hubConnection.keepAliveIntervalInMilliseconds = 300000;
我们也可以在 onclose
事件中再次启动集线器作为临时修复。
this.hubConnection.onclose((error) => {
this.hubConnection.start();
console.error(`Something went wrong: ${error}`);
});
尝试将 SignalR 服务模式切换为无服务器(或经典)