SignalR 永远不会使用 Xamarin Forms 在 iOS 上启动

SignalR never start on iOS using Xamarin Forms

我正尝试在我的 Xamarin Forms 项目中使用 SignalR。 当我使用 Android(设备或模拟器)时,它工作得很好。 但是在 iOS 上使用相同的代码,它挂在 await hubConnection.StartAsync();

我正在使用 Visual Studio 2022。 XAML 热重载已禁用。 我已经尝试添加 System.Memory 和 System.Buffers IncludeAssets None 修复。

这是代码

public async Task StartObserving()
{
    Uri signalRUri = new Uri("a-valid-uri-string-here");
    string jwt = await SecureStorage.GetAsync(SecureStorageKeys.IdToken);

    HubConnection hubConnection = new HubConnectionBuilder()
        .WithUrl(
            signalRUri,
            options =>
            {
                options.AccessTokenProvider = () => Task.FromResult(jwt);
                options.WebSocketConfiguration = (clientWebSocketOptions) =>
                {
                    clientWebSocketOptions.RemoteCertificateValidationCallback = (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) =>
                    {
                        return true;
                    };
                };
                options.HttpMessageHandlerFactory = (httpMessageHandler) =>
                {
                    if (httpMessageHandler is HttpClientHandler clientHandler)
                    {
                        clientHandler.ServerCertificateCustomValidationCallback = (HttpRequestMessage httpRequestMessage, X509Certificate2 certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) =>
                        {
                            return true;
                        };
                    }

                    return httpMessageHandler;
                };
            })
        .ConfigureLogging(logging =>
        {
            logging.SetMinimumLevel(LogLevel.Trace);
            logging.AddConsole();
        })
        .Build();

    hubConnection.On<string>(
        "Send",
        OnMessageReceivedFromSignalR);

    await hubConnection.StartAsync();
}

这是 SignalR 日志

2022-03-23 13:21:01.453 MyApp.iOS[2581:54607] [40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.SignalR.Client.HubConnection[40] Registering handler for client method 'Send'.

2022-03-23 13:21:01.464 MyApp.iOS[2581:54607] [40m[37mtrce[39m[22m[49m: Microsoft.AspNetCore.SignalR.Client.HubConnection[42] Waiting on Connection Lock in StartAsyncInner (/_/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs:247).

2022-03-23 13:21:01.472 MyApp.iOS[2581:54607] [40m[37mtrce[39m[22m[49m: Microsoft.AspNetCore.SignalR.Client.HubConnection[80] The HubConnection is attempting to transition from the Disconnected state to the Connecting state.

2022-03-23 13:21:01.476 MyApp.iOS[2581:54607] [40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.SignalR.Client.HubConnection[41] Starting HubConnection.

2022-03-23 13:21:01.486 MyApp.iOS[2581:54607] [40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[1] Starting HttpConnection.

2022-03-23 13:21:01.503 MyApp.iOS[2581:54607] [40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[5] Skipping dispose, connection is already disposed.

2022-03-23 13:21:01.506 MyApp.iOS[2581:54607] [40m[37mtrce[39m[22m[49m: Microsoft.AspNetCore.SignalR.Client.HubConnection[80] The HubConnection is attempting to transition from the Connecting state to the Disconnected state.

2022-03-23 13:21:01.506 MyApp.iOS[2581:54607] [40m[37mtrce[39m[22m[49m: Microsoft.AspNetCore.SignalR.Client.HubConnection[20] Releasing Connection Lock in StartAsyncInner (/_/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs:280).

我收到以下异常

System.MissingMethodException: Method not found: Microsoft.AspNetCore.Http.Connections.NegotiationResponse Microsoft.AspNetCore.Http.Connections.NegotiateProtocol.ParseResponse(System.ReadOnlySpan1) at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[TResult].Start[TStateMachine] (TStateMachine& stateMachine) [0x0002c] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:471 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) [0x0003d] in :0 at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.GetNegotiationResponseAsync (System.Uri uri, System.Threading.CancellationToken cancellationToken) [0x00011] in :0 at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.SelectAndStartTransport (Microsoft.AspNetCore.Connections.TransferFormat transferFormat, System.Threading.CancellationToken cancellationToken) [0x0017b] in :0 at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsyncCore (Microsoft.AspNetCore.Connections.TransferFormat transferFormat, System.Threading.CancellationToken cancellationToken) [0x00127] in :0 at System.Threading.Tasks.ForceAsyncAwaiter.GetResult () [0x0000c] in :0 at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsync (Microsoft.AspNetCore.Connections.TransferFormat transferFormat, System.Threading.CancellationToken cancellationToken) [0x00091] in :0 at Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.ConnectAsync (System.Net.EndPoint endPoint, System.Threading.CancellationToken cancellationToken) [0x00114] in :0
at Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.ConnectAsync (System.Net.EndPoint endPoint, System.Threading.CancellationToken cancellationToken) [0x001bf] in :0
at Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncCore (System.Threading.CancellationToken cancellationToken) [0x000a9] in <22c2b3ef3848439db8bf52b72cbcab20>:0 at Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncInner (System.Threading.CancellationToken cancellationToken) [0x001a3] in <22c2b3ef3848439db8bf52b72cbcab20>:0 at System.Threading.Tasks.ForceAsyncAwaiter.GetResult () [0x0000c] in <22c2b3ef3848439db8bf52b72cbcab20>:0 at Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsync (System.Threading.CancellationToken cancellationToken) [0x00091] in <22c2b3ef3848439db8bf52b72cbcab20>:0 at MyApp.StartObserving () [0x0027b] in C:\Dev\MobileApp\MyApp\MyApp\Services\CacheService.cs:279

嗯,我只实施了一半的解决方案。

为我解决问题的是将其添加到 BOTH 公共项目和 iOS 项目中。 不仅是普通项目。

<PackageReference Include="System.Buffers">
  <Version>4.5.1</Version>
  <IncludeAssets>none</IncludeAssets>      
</PackageReference>
<PackageReference Include="System.Memory">
  <Version>4.5.4</Version>
  <IncludeAssets>none</IncludeAssets>      
</PackageReference>