关于Blazor Auto渲染模式:WASM下载后能否立即断开WebSocket?
在Blazor Auto渲染模式下WASM就绪后主动断开SignalR连接
要实现WASM下载完成后立即断开原SignalR连接,避免出现重连提示,可通过以下步骤操作:
1. 监听WASM加载完成事件
Blazor在WebAssembly模块加载完成后会触发blazor.webassembly.loaded JavaScript事件,可利用该事件触发断开连接的逻辑。
2. 实现.NET端断开连接逻辑
首先在客户端组件中注入HubConnection(针对框架内置的Blazor SignalR连接),并创建一个可被JavaScript调用的服务类:
using Microsoft.AspNetCore.SignalR.Client; using Microsoft.JSInterop; public class SignalRConnectionManager { private readonly HubConnection _hubConnection; public SignalRConnectionManager(HubConnection hubConnection) { _hubConnection = hubConnection; } [JSInvokable("DisconnectBlazorSignalR")] public async Task DisconnectAsync() { if (_hubConnection.State == HubConnectionState.Connected) { await _hubConnection.StopAsync(); await _hubConnection.DisposeAsync(); } } }
在Program.cs客户端配置中注册服务及内置Blazor SignalR连接:
builder.Services.AddScoped<SignalRConnectionManager>(); builder.Services.AddScoped(sp => { var navigationManager = sp.GetRequiredService<NavigationManager>(); return new HubConnectionBuilder() .WithUrl(navigationManager.ToAbsoluteUri("/_blazor")) .Build(); });
3. 在JavaScript中触发断开操作
在wwwroot/index.html中添加脚本,监听WASM加载完成事件并调用.NET方法:
<script> window.addEventListener('blazor.webassembly.loaded', async () => { try { await DotNet.invokeMethodAsync('你的应用程序集名称', 'DisconnectBlazorSignalR'); console.log("WASM加载完成,已断开Blazor SignalR连接"); } catch (err) { console.error("断开SignalR连接失败:", err); } }); </script>
4. 可选:通过组件验证渲染模式(Blazor 8+)
若需精准判断是否切换到WASM渲染模式,可在组件的OnAfterRenderAsync中添加逻辑:
@inject SignalRConnectionManager ConnectionManager @inject IRenderModeProvider RenderModeProvider @code { protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender && RenderModeProvider.CurrentRenderMode == RenderMode.WebAssembly) { await ConnectionManager.DisconnectAsync(); } } }
注:早期版本可通过OperatingSystem.IsBrowser()判断是否处于WASM环境。
以上操作会在WASM加载完成并切换到WebAssembly渲染模式时,主动断开原SSR SignalR连接,大幅降低重连提示出现的概率。
内容的提问来源于stack exchange,提问作者SugarCoding
相关产品推荐
相关产品推荐

