You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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.)
 ---&gt; Microsoft.AspNetCore.Http.Connections.Client.TransportFailedException: WebSockets failed: A task was canceled.
 ---&gt; System.Threading.Tasks.TaskCanceledException: A task was canceled.
   at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.&lt;WaitWithCancellationAsync&gt;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()
 ---&gt; (Inner Exception #1) Microsoft.AspNetCore.Http.Connections.Client.TransportFailedException: ServerSentEvents failed: The operation was canceled.
 ---&gt; System.Threading.Tasks.TaskCanceledException: The operation was canceled.
 ---&gt; 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.&lt;SendAsync&gt;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.&lt;SendAsync&gt;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 ---&lt;---

 ---&gt; (Inner Exception #2) Microsoft.AspNetCore.Http.Connections.Client.TransportFailedException: LongPolling failed: The operation was canceled.
 ---&gt; System.Threading.Tasks.TaskCanceledException: The operation was canceled.
 ---&gt; 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.&lt;SendAsync&gt;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.&lt;SendAsync&gt;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 ---&lt;---

已尝试的解决方案

  • 测试Android模拟器/真机的Debug/Release构建
  • 更换多台真机测试
  • 切换服务端/客户端的HTTP/HTTPS协议
  • 检查DNS解析,结果正常
  • 提升日志级别以获取详细日志
  • 简化.NET Blazor后端的服务与配置
  • 调整客户端SignalR超时设置
  • 更换不同域名测试
  • 清理bin/obj文件夹
  • 重启Visual Studio及电脑
  • 测试期间多次卸载重装应用

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:50:53