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

时间:2020-04-17 04:31:12

标签: signalr blazor blazor-server-side asp.net-core-signalr

我创建了一个基本的Blazor服务器端聊天,但是从未调用过OnDisconnectedAsync,即使关闭了浏览器,连接仍保持活动状态。

OnDisconnectAsync方法位于ChatHub.cs内部:

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

如果改用Blazor WebAssembly,则相同的代码也可以工作。 我不知道这是错误还是缺少的东西。

1 个答案:

答案 0 :(得分:0)

我弄清楚了为什么未调用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 Server。如果Blazor WebAssembly上的集线器连接位于单个组件中,则也必须对其进行处理。