升级到.NET 6后SignalR无法连接 Xamarin客户端长期处于连接中状态
问题排查&解决步骤
你遇到的是.NET版本升级后SignalR服务端/客户端兼容性问题,按以下优先级排查即可:
- 第一步:确认SignalR两端版本匹配
.NET 6 对应的SignalR服务端版本为v6.x,要求客户端的Microsoft.AspNetCore.SignalR.ClientNuget包版本必须≥v5.0,优先升级到和服务端大版本一致的v6.x版本,低于v5的旧版客户端无法兼容.NET 6的SignalR服务端,会直接卡在连接状态。 - 第二步:校验服务端中间件配置顺序
即使你没有修改原有Program/Startup类,也要确认中间件顺序符合.NET 6的要求:
SignalR要求CORS策略必须开启// 顺序不能错:先Routing → 再CORS → 最后映射Hub app.UseRouting(); // 如果你配置了CORS,必须显式允许凭证,且不能用AllowAnyOrigin app.UseCors(builder => builder .WithOrigins("你的客户端允许的域名/地址") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials()); app.UseEndpoints(endpoints => { endpoints.MapHub<NotifyHub>("/hobosoft/notifier"); });AllowCredentials,否则预检请求会被拦截,导致连接卡住。 - 第三步:适配TLS版本要求
.NET 6默认最低支持TLS 1.2版本,Xamarin项目默认可能未启用高版本TLS:- Xamarin.Android:项目属性→Android选项→高级,将HttpClient实现改为
AndroidClientHandler,SSL/TLS实现改为原生TLS 1.2+ - Xamarin.iOS:项目属性→iOS生成,将HttpClient实现改为
NSUrlSession
- Xamarin.Android:项目属性→Android选项→高级,将HttpClient实现改为
- 第四步:针对性调整连接配置
如果上述步骤都排查完还是连接失败,可以在客户端构建Hub连接时新增两个配置,跳过协商直接使用WebSocket协议,规避版本兼容问题:hubConnection = new HubConnectionBuilder() .WithUrl("https://10.0.0.189:9001/hobosoft/notifier", options => { // 原有证书验证逻辑保留 options.HttpMessageHandlerFactory = (message) => { if (message is HttpClientHandler clientHandler) clientHandler.ServerCertificateCustomValidationCallback +=(sender, certificate, chain, sslPolicyErrors) => { return true; }; return message; }; // 新增以下两行 options.SkipNegotiation = true; options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets; }) .WithAutomaticReconnect() .Build(); - 可选:开启日志定位具体错误
如果还是无法定位问题,可以在客户端构建连接时添加日志输出,直接查看连接阶段的具体报错:// Build之前添加 .ConfigureLogging(logging => { logging.AddConsole(); logging.SetMinimumLevel(LogLevel.Debug); })
内容的提问来源于stack exchange,提问作者Morek Povýšil
相关产品推荐
相关产品推荐

