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>
我正尝试在我的 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>