C# SignalR Core检测连接是否被客户端或服务器关闭

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

在ASP.NET Core 2.1 LTS上,有。所以我用自己的软件实现了它。虽然这样做有效,但也有一个副作用:当连接被客户端本身取消时,客户端也会尝试重新连接,例如在关闭浏览器选项卡时

重新连接会在短时间内工作,直到选项卡关闭。由于我在重新连接时重新加载通知以使用户在这种情况下保持最新,这是对资源的浪费,因为我对关闭选项卡的用户执行了多个SQL查询

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")
    }
})
当客户端失去网络连接(例如,在移动设备上)时,我必须尝试一下这是否也能正常工作,在这种情况下,重新连接是有用的