我通过SignalR从客户端(角度9)和服务器(asp.net核心3.1)创建实时连接,并通过JWT令牌授权集线器,例如以下代码:
private createConnection() {
this.hubConnection = new HubConnectionBuilder().withUrl(`${this.appConfig.hubEndpoint}/Hubs`,
{ accessTokenFactory: () => jwtToken })
.withAutomaticReconnect()
.build();
}
private startConnection(): void {
this.hubConnection
.start()
.then(() => {
this.connectionIsEstablished = true;
this.connectionEstablished.emit(true);
})
.catch(err => {
console.log('Error while establishing connection, retrying...');
});
}
这可以正常工作,直到令牌过期。根据我的研究,在收到带有刷新令牌的新令牌之后,应停止先前的连接,并使用新令牌创建一个新连接。 现在我想知道该怎么做?我需要经常检查令牌吗?还是应该通过将每个请求发送到服务器来解决?
答案 0 :(得分:0)
当令牌到期时,服务器将断开连接,服务器端将出现错误。我相信您会得到405错误代码Method now allowed
。
因此,您需要捕获此令牌到期错误并断开连接,以便可以使用新令牌启动一个新令牌。
答案 1 :(得分:0)
什么对我有用,这是一个快速而肮脏的修复,是在关闭事件时重新加载页面:
this.hubConnection.onclose(() =>{
window.location.reload()
})
说明
我正在用 RxJS 包装连接过程,所以对我的情况更好的解决方法是抛出错误而不是重新加载页面并使用 retryWhen
运算符捕获它。但由于这是一个硬错误(需要等待 1 小时让令牌过期,并且本地模拟器不关心令牌......),我只是更喜欢使用这个临时解决方案。