.NET 8 MAUI Android端SignalR连接初始化耗时1.5分钟求助
.NET 8 MAUI Android端SignalR连接初始化异常问题
问题概述
-.NET 8 MAUI Android应用连接.NET 8 SignalR Hub时出现异常
- 当前使用.NET 8 GA版本,此前为.NET 8 RC版本
- 问题出现约一周,仅在真机触发,模拟器运行正常
- SignalR(HTTP/HTTPS)连接初始化常耗时约1.5分钟,偶发连接失败,有时可正常连接
- 问题与HTTP/HTTPS协议无关
客户端信息
-.NET 8 MAUI iOS和Android应用,仅Android端存在问题,iOS未做详细测试
- Android模拟器中Debug/Release构建均可正常运行
- 真机设备(开发机Debug/Release、应用商店Release版本)均存在问题
- 已安装的dotnet工作负载:
ios 17.0.8478/8.0.100 VS 17.8.34309.116 android 34.0.43/8.0.100 VS 17.8.34309.116
服务端信息
- 服务运行在Docker中,基于.NET 8 GA版本
- 服务端使用Lets Encrypt证书
- Docker容器采用最新.NET 8镜像模板
客户端代码(MAUI应用)
Hub = new HubConnectionBuilder() .WithUrl(_ApiHubConnectionString) .WithAutomaticReconnect() .ConfigureLogging(logging => { logging.SetMinimumLevel(LogLevel.Debug); }) .Build(); // ... Log.Debug("SignalR Hub starting, ConnectionString = {HubConnectionString}", _ApiHubConnectionString); await Hub.StartAsync(); Log.Debug("SignalR Hub started, ConnectionString = {HubConnectionString}", _ApiHubConnectionString);
示例连接字符串
- http://service.mydomain.net/myhub
- https://service.mydomain.net/myhub
服务端代码
var builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR(hubOptions => { hubOptions.EnableDetailedErrors = true; }); // ... builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); builder.Services.AddHttpClient(); var app = builder.Build(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapFallbackToPage("/_Host"); app.MapHub<MyHub>($"/{nameof(MyHub)}");
异常日志
17:45:39.875 SignalR Hub starting, ConnectionString = URL 17:46:50.819 New connection -Qd4psbQgCumVVw3RED-uA created. 17:46:50.820 Sending negotiation response. 17:47:06.452 Removing connection bkSV_uGwzmEVsaa_82zXRA from the list of connections. // Don't know if this is related 17:47:58.771 New connection ZgJSXQLT0oNspEMjwyTkUg created. 17:47:58.771 Sending negotiation response. Note: all of the following is for connection ZgJSXQLT0oNspEMjwyTkUg 17:47:58.822 Establishing new connection. 17:47:58.823 OnConnectedAsync started. 17:47:59.018 Found protocol implementation for requested protocol: json. 17:47:59.018 Completed connection handshake. Using HubProtocol 'json'.
客户端连接错误日志及异常
17:56:19.618 SignalR Hub starting, ConnectionString = URL 17:57:25.479 New connection t7UpffSa6MhxQXmnzY7bqA created. 17:57:25.479 Sending negotiation response. 17:57:41.449 Removing connection Wp41QfpkV7uGtt5xMNnmjw from the list of connections. 17:57:46.076 DisconnectHubAsync, State = Connecting 17:57:46.110 SignalR Hub error trying to connect to Hub (EXCEPTION) Exception: System.AggregateException: Unable to connect to the server with any of the available transports. (WebSockets failed: A task was canceled.) (ServerSentEvents failed: The operation was canceled.) (LongPolling failed: The operation was canceled.) ---> Microsoft.AspNetCore.Http.Connections.Client.TransportFailedException: WebSockets failed: A task was canceled. ---> System.Threading.Tasks.TaskCanceledException: A task was canceled. at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.<WaitWithCancellationAsync>d__1[[System.Net.Http.HttpConnection, System.Net.Http, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext() at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken) at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.WebSockets.WebSocketHandle.ConnectAsync(Uri uri, HttpMessageInvoker invoker, CancellationToken cancellationToken, ClientWebSocketOptions options) at System.Net.WebSockets.ClientWebSocket.ConnectAsyncCore(Uri uri, HttpMessageInvoker invoker, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.Internal.WebSocketsTransport.DefaultWebSocketFactory(WebSocketConnectionContext context, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.Internal.WebSocketsTransport.StartAsync(Uri url, TransferFormat transferFormat, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartTransport(Uri connectUrl, HttpTransportType transportType, TransferFormat transferFormat, CancellationToken cancellationToken, Boolean useStatefulReconnect) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.SelectAndStartTransport(TransferFormat transferFormat, CancellationToken cancellationToken) --- End of inner exception stack trace --- --- End of inner exception stack trace --- at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.SelectAndStartTransport(TransferFormat transferFormat, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsyncCore(TransferFormat transferFormat, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsync(TransferFormat transferFormat, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.ConnectAsync(EndPoint endPoint, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.ConnectAsync(EndPoint endPoint, CancellationToken cancellationToken) at Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncCore(CancellationToken cancellationToken) at Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncInner(CancellationToken cancellationToken) at Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsync(CancellationToken cancellationToken) at MYNAMESPACE.Services.ApiService.ConnectHubIfRequired() ---> (Inner Exception #1) Microsoft.AspNetCore.Http.Connections.Client.TransportFailedException: ServerSentEvents failed: The operation was canceled. ---> System.Threading.Tasks.TaskCanceledException: The operation was canceled. ---> System.OperationCanceledException: The operation was canceled. at System.Threading.CancellationToken.ThrowOperationCanceledException() at System.Threading.CancellationToken.ThrowIfCancellationRequested() at Xamarin.Android.Net.AndroidMessageHandler.ProcessRequest(HttpRequestMessage request, URL javaUrl, HttpURLConnection httpConnection, CancellationToken cancellationToken, RequestRedirectionState redirectState) at Xamarin.Android.Net.AndroidMessageHandler.DoSendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.Internal.AccessTokenHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.Internal.LoggingHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) --- End of inner exception stack trace --- at System.Net.Http.HttpClient.HandleFailure(Exception e, Boolean telemetryStarted, HttpResponseMessage response, CancellationTokenSource cts, CancellationToken cancellationToken, CancellationTokenSource pendingRequestsCts) at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.NegotiateAsync(Uri url, HttpClient httpClient, ILogger logger, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.GetNegotiationResponseAsync(Uri uri, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.SelectAndStartTransport(TransferFormat transferFormat, CancellationToken cancellationToken) --- End of inner exception stack ---<--- ---> (Inner Exception #2) Microsoft.AspNetCore.Http.Connections.Client.TransportFailedException: LongPolling failed: The operation was canceled. ---> System.Threading.Tasks.TaskCanceledException: The operation was canceled. ---> System.OperationCanceledException: The operation was canceled. at System.Threading.CancellationToken.ThrowOperationCanceledException() at System.Threading.CancellationToken.ThrowIfCancellationRequested() at Xamarin.Android.Net.AndroidMessageHandler.ProcessRequest(HttpRequestMessage request, URL javaUrl, HttpURLConnection httpConnection, CancellationToken cancellationToken, RequestRedirectionState redirectState) at Xamarin.Android.Net.AndroidMessageHandler.DoSendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.Internal.AccessTokenHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.Internal.LoggingHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) --- End of inner exception stack --- at System.Net.Http.HttpClient.HandleFailure(Exception e, Boolean telemetryStarted, HttpResponseMessage response, CancellationTokenSource cts, CancellationToken cancellationToken, CancellationTokenSource pendingRequestsCts) at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.NegotiateAsync(Uri url, HttpClient httpClient, ILogger logger, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.GetNegotiationResponseAsync(Uri uri, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.SelectAndStartTransport(TransferFormat transferFormat, CancellationToken cancellationToken) --- End of inner exception stack ---<---
已尝试的解决方案
- 测试Android模拟器/真机的Debug/Release构建
- 更换多台真机测试
- 切换服务端/客户端的HTTP/HTTPS协议
- 检查DNS解析,结果正常
- 提升日志级别以获取详细日志
- 简化.NET Blazor后端的服务与配置
- 调整客户端SignalR超时设置
- 更换不同域名测试
- 清理bin/obj文件夹
- 重启Visual Studio及电脑
- 测试期间多次卸载重装应用
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

