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 上的集线器连接存在于单个组件中,则也必须处理它。
我创建了一个基本的 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 上的集线器连接存在于单个组件中,则也必须处理它。