Azure上运行Blazor应用遇WebSocket 1006错误求助
Azure Blazor应用WebSocket 1006连接断开问题排查与解决
针对你遇到的WebSocket 1006错误(3-4分钟后触发,关联EF Core数据库操作,本地正常Azure部署异常),可以从以下几个方向排查解决:
1. 规范EF Core DbContext生命周期管理
Blazor Server中DbContext默认应为Scoped生命周期,若错误地将其注册为Singleton、手动实例化后长期持有,会导致数据库连接泄漏、资源耗尽,最终引发Circuit异常和WebSocket断开。
- 确保在
Program.cs中正确注册:builder.Services.AddDbContext<YourDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("YourConnStr"))); - 组件或服务中通过构造注入/
@inject获取DbContext,避免手动创建实例后保留引用;若必须手动创建,务必在使用完毕后调用DisposeAsync释放。
2. 调整Azure App Service超时与WebSocket配置
Azure App Service的默认网络/空闲设置可能导致WebSocket连接被主动断开:
- 在Azure门户进入应用服务→配置→常规设置,将空闲超时调整为30分钟以上;
- 在应用程序设置中添加以下配置:
WEBSOCKET_KEEPALIVE_INTERVAL:设置为20(单位秒),定期发送心跳包维持连接;ARR_DELAYED_RESPONSE:设置为true,避免ARR(应用程序请求路由)提前断开长连接。
3. 清理Blazor Circuit关联资源
Blazor Server的Circuit会绑定用户会话,若组件持有未释放的资源(如DbContext、数据库连接),会导致Circuit异常崩溃,进而断开WebSocket:
- 若组件使用了IDisposable/IAsyncDisposable资源,实现对应接口进行清理:
public class DataOperationComponent : ComponentBase, IAsyncDisposable { private YourDbContext? _localDbContext; public async ValueTask DisposeAsync() { if (_localDbContext != null) { await _localDbContext.DisposeAsync(); } } }
4. 排查服务器端日志与性能瓶颈
本地环境无异常是因为资源限制宽松,Azure端需通过日志定位根本原因:
- 开启应用服务→日志→应用服务日志,启用详细错误日志和日志流,当WebSocket断开时查看服务器端是否有未处理的EF Core异常(如数据库超时、连接池耗尽);
- 通过应用服务→监控→应用洞察查看性能指标,重点关注数据库连接数、请求响应时间,排查是否存在资源瓶颈。
5. 调整Blazor Circuit配置
延长Circuit保留时间与JS互操作超时,避免因长时间数据库操作触发连接断开:
builder.Services.AddServerSideBlazor() .AddCircuitOptions(options => { options.DisconnectedCircuitRetentionPeriod = TimeSpan.FromMinutes(5); options.JSInteropDefaultCallTimeout = TimeSpan.FromSeconds(30); });
6. 优化数据库连接字符串
在连接字符串中添加连接池与超时配置,防止连接耗尽或操作超时:
Server=tcp:yourserver.database.windows.net,1433;Initial Catalog=yourdb;Persist Security Info=False;User ID=youruser;Password=yourpass;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Max Pool Size=100;
内容的提问来源于stack exchange,提问作者zawisza
相关产品推荐
相关产品推荐

