Asp.Net Blazor 服务器端的核心 SignalR 从不调用 OnDisconnectedAsync

Asp.Net Core SignalR on Blazor Server-Side never calls OnDisconnectedAsync

我创建了一个基本的 Blazor 服务器端聊天,但从未调用过 OnDisconnectedAsync,即使浏览器关闭,连接仍然存在。

OnDisconnectAsync 方法在 ChatHub.cs:

public override async Task OnDisconnectedAsync(Exception exception)
    {
        Debug.WriteLine("Disconnected");
    }

如果改用 Blazor WebAssembly,则相同的代码也可以工作。 我不明白这是一个错误还是我遗漏了什么。

我弄清楚了为什么没有调用 OnDisconnectAsync,Steve Sanderson 从我在 GitHub 上打开的问题中给出了解决方案:

https://github.com/dotnet/aspnetcore/issues/20932#event-3245802796

Blazor 服务器处理连接,但不处理必须手动处理的 HubConnection。由于 Blazor 不支持 IAsyncDisposable,因此不会等待对 DisposeAsync 的调用,也不能等待 DisposeAsync:

@implements IDisposable

... rest of component code ...

@code {
    public void Dispose()
    {
        _hubConnection.DisposeAsync();
    }
}

这不仅适用于 Blazor 服务器。如果 Blazor WebAssembly 上的集线器连接存在于单个组件中,则也必须处理它。