C# SignalR Core检测连接是否被客户端或服务器关闭
在ASP.NET Core 2.1 LTS上,有。所以我用自己的软件实现了它。虽然这样做有效,但也有一个副作用:当连接被客户端本身取消时,客户端也会尝试重新连接,例如在关闭浏览器选项卡时 重新连接会在短时间内工作,直到选项卡关闭。由于我在重新连接时重新加载通知以使用户在这种情况下保持最新,这是对资源的浪费,因为我对关闭选项卡的用户执行了多个SQL查询C# SignalR Core检测连接是否被客户端或服务器关闭,c#,asp.net-core,signalr,asp.net-core-2.1,asp.net-core-signalr,C#,Asp.net Core,Signalr,Asp.net Core 2.1,Asp.net Core Signalr,在ASP.NET Core 2.1 LTS上,有。所以我用自己的软件实现了它。虽然这样做有效,但也有一个副作用:当连接被客户端本身取消时,客户端也会尝试重新连接,例如在关闭浏览器选项卡时 重新连接会在短时间内工作,直到选项卡关闭。由于我在重新连接时重新加载通知以使用户在这种情况下保持最新,这是对资源的浪费,因为我对关闭选项卡的用户执行了多个SQL查询 let reconnectWaitTime = 5000 let client = new signalR.HubConnectionBuilde
let reconnectWaitTime = 5000
let client = new signalR.HubConnectionBuilder()
.withUrl("/overviewHub")
.build();
client.onclose(async (e) => {
await tryReconnect(client)
notificationsManager.handleReConnect()
})
await tryReconnect(client)
let notificationsManager = new ULNotificationsManager(client)
async function tryReconnect(client,) {
try {
let started = await client.start()
return started;
} catch (e) {
await new Promise(resolve => setTimeout(resolve, reconnectWaitTime));
return await tryReconnect(client)
}
}
如何检测连接是否已从客户端或服务器关闭,以便仅在服务器关闭连接时才能重新加载通知数据?
方法
,对于onclose
方法,应该有一个错误
回调:
client.onclose(function(ev){
console.warn(ev)
})
我的想法是使用这个错误来获取更详细的信息,比如一些让我过滤掉客户端中止的错误代码。但这似乎不起作用,我的日志中有未定义的
更新
我的解决方案似乎并非在所有情况下都有效。例如当dotnet
控制台窗口关闭时,没有异常,因此也没有重新连接。在这种情况下,我假设.NET core正确地关闭了连接
我试图通过重写hub的Dispose
方法来解决这个问题,调用客户端上触发我的重新连接的一些事件。不好用。最后,我使用窗口.onbeforeunload
事件检测用户是否离开
window.onbeforeunload = function () {
window.userIsNavigatingAway = true
return
};
并检查此布尔值,而不是关闭错误
client.onclose(async (error) => {
// https://stackoverflow.com/a/57833660/3276634
if (!window.userIsNavigatingAway) {
await tryReconnect(client, initialReConnectWaitTime)
console.log('ReConnect worked')
notificationsManager.handleReConnect()
} else {
console.log("Client closed the WS connection, so no reconnect attemp is made")
}
})
原版服装
这仅在服务器意外终止时有效
发现错误回调涉及服务器端问题:当服务器中止连接(例如服务器重新启动)时,我得到一个错误
对象:
Error: "WebSocket closed with status code: 1006 ()."
因此,通过检查错误是否未定义,可以轻松解决我的问题:
client.onclose(async (error) => {
if (typeof error !== 'undefined') {
await tryReconnect(client)
notificationsManager.handleReConnect()
} else {
console.log("Client closed the WS connection, so no reconnect attemp is made")
}
})
当客户端失去网络连接(例如,在移动设备上)时,我必须尝试一下这是否也能正常工作,在这种情况下,重新连接是有用的