慢速 4g 网络 - 有时 Signalr HubConnection.StartAync 永远不会返回或有时网络无法访问的异常出现在 Xamarin Android

问题描述 投票:0回答:1

我们有一个 Xamarin Android 应用程序,它使用 Signalr 与服务器通信。该应用程序有一个前台服务,它保持连续的信号-r 连接。有时,在连接断开时的慢速网络中,应用程序无法重新建立与服务器的连接。有时 startAsync 永远不会返回,或者有时网络是无法访问的异常即将到来。但我们注意到,与此同时,其他应用程序能够连接到服务器。甚至我们应用程序中的 API 调用也能正常工作。但是 signal-r 连接没有建立。要重新建立连接,我们需要关闭并打开 4g 连接。

public static async Task<SignalrConnection> NewConnection(string token, CancellationToken cancellationToken)
        {
            try
            {
                var url = $"{ConfigService.TRANSFER_URL}";
                var connection = new HubConnectionBuilder()
                    .WithUrl(url, opts =>
                    {
                        opts.Headers.Add("Authorization", $"Bearer {token}");
                    })
                    .AddNewtonsoftJsonProtocol()
                    .Build();
                
                await connection.StartAsync(cancellationToken);

                var sc = new SignalrConnection(connection);
                return sc;
            }
            catch (HttpRequestException ex1)
            {
                if (ex1.Message.Contains("401"))
                {
                    throw new NotAuthorizeException();
                }
                else
                    throw;
            }
            catch (Exception)
            {
                throw;
            }
        }
System.Net.Http.HttpRequestException
Message : Network is unreachable
StackTrace :   at System.Net.Http.ConnectHelper.ConnectAsync (System.String host, System.Int32 port, System.Threading.CancellationToken cancellationToken) [0x001ac] in <7fd014203845408d8ac08616d88f8f38>:0 
  at System.Net.Http.HttpConnectionPool.CreateConnectionAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x00134] in <7fd014203845408d8ac08616d88f8f38>:0 
  at System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync (System.Threading.Tasks.ValueTask`1[TResult] creationTask) [0x000a2] in <7fd014203845408d8ac08616d88f8f38>:0 
  at System.Net.Http.HttpConnectionPool.SendWithRetryAsync (System.Net.Http.HttpRequestMessage request, System.Boolean doRequestAuth, System.Threading.CancellationToken cancellationToken) [0x00089] in <7fd014203845408d8ac08616d88f8f38>:0 
  at System.Net.Http.RedirectHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x000ba] in <7fd014203845408d8ac08616d88f8f38>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.Internal.AccessTokenHttpMessageHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x00163] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.Internal.LoggingHttpMessageHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x0009f] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered (System.Threading.Tasks.Task`1[TResult] sendTask, System.Net.Http.HttpRequestMessage request, System.Threading.CancellationTokenSource cts, System.Boolean disposeCts) [0x000b3] in <7fd014203845408d8ac08616d88f8f38>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.NegotiateAsync (System.Uri url, System.Net.Http.HttpClient httpClient, Microsoft.Extensions.Logging.ILogger logger, System.Threading.CancellationToken cancellationToken) [0x00284] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.GetNegotiationResponseAsync (System.Uri uri, System.Threading.CancellationToken cancellationToken) [0x0008a] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.SelectAndStartTransport (Microsoft.AspNetCore.Connections.TransferFormat transferFormat, System.Threading.CancellationToken cancellationToken) [0x0018e] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsyncCore (Microsoft.AspNetCore.Connections.TransferFormat transferFormat, System.Threading.CancellationToken cancellationToken) [0x00139] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsync (Microsoft.AspNetCore.Connections.TransferFormat transferFormat, System.Threading.CancellationToken cancellationToken) [0x00092] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.ConnectAsync (System.Net.EndPoint endPoint, System.Threading.CancellationToken cancellationToken) [0x0011e] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.ConnectAsync (System.Net.EndPoint endPoint, System.Threading.CancellationToken cancellationToken) [0x001d3] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncCore (System.Threading.CancellationToken cancellationToken) [0x000b3] in <d3cc4f3426ea47de89566d0665431af2>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncInner (System.Threading.CancellationToken cancellationToken) [0x001b6] in <d3cc4f3426ea47de89566d0665431af2>:0 
  at Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsync (System.Threading.CancellationToken cancellationToken) [0x00092] in <d3cc4f3426ea47de89566d0665431af2>:0
Message : WebSockets failed: Unable to connect to the remote server
StackTrace : 
System.Net.WebSockets.WebSocketException
Message : Unable to connect to the remote server
StackTrace :   at System.Net.WebSockets.WebSocketHandle.ConnectAsyncCore (System.Uri uri, System.Threading.CancellationToken cancellationToken, System.Net.WebSockets.ClientWebSocketOptions options) [0x00385] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/WebSocketHandle.Managed.cs:150 
  at System.Net.WebSockets.ClientWebSocket.ConnectAsyncCore (System.Uri uri, System.Threading.CancellationToken cancellationToken) [0x000d1] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/ClientWebSocket.cs:157 
  at Microsoft.AspNetCore.Http.Connections.Client.Internal.WebSocketsTransport.DefaultWebSocketFactory (Microsoft.AspNetCore.Http.Connections.Client.WebSocketConnectionContext context, System.Threading.CancellationToken cancellationToken) [0x003da] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at System.Threading.Tasks.ValueTask`1[TResult].get_Result () [0x0001b] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/Common/src/CoreLib/System/Threading/Tasks/ValueTask.cs:813 
  at Microsoft.AspNetCore.Http.Connections.Client.Internal.WebSocketsTransport.StartAsync (System.Uri url, Microsoft.AspNetCore.Connections.TransferFormat transferFormat, System.Threading.CancellationToken cancellationToken) [0x00123] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartTransport (System.Uri connectUrl, Microsoft.AspNetCore.Http.Connections.HttpTransportType transportType, Microsoft.AspNetCore.Connections.TransferFormat transferFormat, System.Threading.CancellationToken cancellationToken) [0x000c5] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
  at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.SelectAndStartTransport (Microsoft.AspNetCore.Connections.TransferFormat transferFormat, System.Threading.CancellationToken cancellationToken) [0x00531] in <d5c96e7f095e4a9ba210d5848b0716e1>:0 
System.OperationCanceledException
Message : The operation was canceled.
StackTrace :   at System.Net.WebSockets.WebSocketHandle.ConnectSocketAsync (System.String host, System.Int32 port, System.Threading.CancellationToken cancellationToken) [0x001ec] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/WebSocketHandle.Managed.cs:187 
  at System.Net.WebSockets.WebSocketHandle.ConnectSocketAsync (System.String host, System.Int32 port, System.Threading.CancellationToken cancellationToken) [0x002b5] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/WebSocketHandle.Managed.cs:202 
  at System.Net.WebSockets.WebSocketHandle.ConnectAsyncCore (System.Uri uri, System.Threading.CancellationToken cancellationToken, System.Net.WebSockets.ClientWebSocketOptions options) [0x0008d] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/WebSocketHandle.Managed.cs:97 
System.ObjectDisposedException
Message : Cannot access a disposed object.
Object name: 'System.Net.Sockets.Socket'.
StackTrace :   at System.Net.Sockets.Socket.ThrowIfDisposedAndClosed () [0x00010] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/System/System.Net.Sockets/Socket.cs:2896 
  at System.Net.Sockets.Socket.EndConnect (System.IAsyncResult asyncResult) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/System/System.Net.Sockets/Socket.cs:1207 
  at System.Net.Sockets.Socket+<>c.<ConnectAsync>b__10_0 (System.IAsyncResult iar) [0x0000c] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.Sockets/src/System/Net/Sockets/Socket.Tasks.cs:141 
--- End of stack trace from previous location where exception was thrown ---

  at System.Net.WebSockets.WebSocketHandle.ConnectSocketAsync (System.String host, System.Int32 port, System.Threading.CancellationToken cancellationToken) [0x0016c] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/external/corefx/src/System.Net.WebSockets.Client/src/System/Net/WebSockets/WebSocketHandle.Managed.cs:178 
c# xamarin.forms xamarin.android signalr signalr.client
1个回答
0
投票

这可能对某人有用。早些时候我每次都在创建新的连接。但是在开始重用连接对象之后,问题就消失了。在慢速网络中,我只是循环调用 connection.StartAsync 直到建立连接。

© www.soinside.com 2019 - 2024. All rights reserved.