我创建了一个基本的Blazor服务器端聊天,但从未调用OnDisconnectedAsync,即使浏览器关闭,连接也保持活动状态。
OnDisconnectAsync方法位于ChatHub.cs:内部
public override async Task OnDisconnectedAsync(Exception exception)
{
Debug.WriteLine("Disconnected");
}
如果使用Blazor WebAssembly,同样的代码也会起作用。我不明白这是一个bug还是我遗漏了什么。
我弄清楚了为什么没有调用OnDisconnectAsync,解决方案是Steve Sanderson从我在GitHub:上打开的问题中给出的
https://github.com/dotnet/aspnetcore/issues/20932#event-3245802796
Blazor服务器处理连接,但不处理必须手动处理的HubConnection。由于Blazor不支持IAsyncDisposable,因此不会等待对DisposeSync的调用,也不能等待DisposeSync:
@implements IDisposable
... rest of component code ...
@code {
public void Dispose()
{
_hubConnection.DisposeAsync();
}
}
这不仅仅适用于Blazor服务器。如果Blazor WebAssembly上的集线器连接位于单个组件中,则也必须对其进行处理。