SignalR 永远不会使用 Xamarin Forms 在 iOS 上启动
我正在尝试在我的 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] 正在注册客户端方法“发送”的处理程序。
2022-03-23 13:21:01.464 MyApp.iOS[2581:54607] [40m[37mtrce[39m[22m[49m: Microsoft.AspNetCore.SignalR.Client.HubConnection[42] 等待 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] HubConnection 正在尝试从 Disconnected 状态转换到 Connecting 状态。
2022-03-23 13:21:01.476 MyApp.iOS[2581:54607] [40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.SignalR.Client.HubConnection[41] 正在启动 HubConnection。
2022-03-23 13:21:01.486 MyApp.iOS[2581:54607] [40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[1] 正在启动 HttpConnection。
2022-03-23 13:21:01.503 MyApp.iOS[2581:54607] [40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[5] 跳过处置,连接已处置。
2022-03-23 13:21:01.506 MyApp.iOS[2581:54607] [40m[37mtrce[39m[22m[49m: Microsoft.AspNetCore.SignalR.Client.HubConnection[80] HubConnection 正在尝试从“正在连接”状态转换到“已断开连接”状态。
2022-03-23 13:21:01.506 MyApp.iOS[2581:54607] [40m[37mtrce[39m[22m[49m: Microsoft.AspNetCore.SignalR.Client.HubConnection[20] 在 StartAsyncInner (/_/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs:280) 中释放连接锁定。
我收到以下异常
System.MissingMethodException:找不到方法: Microsoft.AspNetCore.Http.Connections.NegotiationResponse Microsoft.AspNetCore.Http.Connections.NegotiateProtocol.ParseResponse(System.ReadOnlySpan1) 在 System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[TResult].Start[TStateMachine] (TStateMachine&stateMachine) [0x0002c] 中 /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:471 在 Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.NegotiateAsync (System.Uri url、System.Net.Http.HttpClient httpClient、 Microsoft.Extensions.Logging.ILogger 记录器, System.Threading.CancellationToken取消令牌)[0x0003d]中 :0 于 Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.GetNegotiationResponseAsync (System.Uri uri、System.Threading.CancellationToken 取消令牌) [0x00011] 在 :0 处 Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.SelectAndStartTransport (Microsoft.AspNetCore.Connections.TransferFormat 传输格式, System.Threading.CancellationToken取消令牌)[0x0017b]中 :0 于 Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsyncCore (Microsoft.AspNetCore.Connections.TransferFormat 传输格式, System.Threading.CancellationToken取消令牌)[0x00127]中 :0 于 System.Threading.Tasks.ForceAsyncAwaiter.GetResult()[0x0000c]中 :0 于 Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsync (Microsoft.AspNetCore.Connections.TransferFormat 传输格式, System.Threading.CancellationToken取消令牌)[0x00091]中 :0 于 Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.ConnectAsync (System.Net.EndPoint 端点、System.Threading.CancellationToken 取消令牌)[0x00114] 在:0
在 Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.ConnectAsync (System.Net.EndPoint 端点、System.Threading.CancellationToken cancelledToken) [0x001bf] in :0
在 Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncCore (System.Threading.CancellationToken取消令牌)[0x000a9]中 <22c2b3ef3848439db8bf52b72cbcab20>:0 在 Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncInner (System.Threading.CancellationToken取消令牌)[0x001a3]中 <22c2b3ef3848439db8bf52b72cbcab20>:0 在 System.Threading.Tasks.ForceAsyncAwaiter.GetResult()[0x0000c]中 <22c2b3ef3848439db8bf52b72cbcab20>:0 在 Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsync (System.Threading.CancellationToken取消令牌)[0x00091]中 <22c2b3ef3848439db8bf52b72cbcab20>:0 在 MyApp.StartObserving () [0x0027b] 在 C:\Dev\MobileApp\MyApp\MyApp\Services\CacheService.cs:279
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

好吧,我只实施了一半的解决方案。
对我来说解决这个问题的方法是将其添加到两个常见项目和iOS项目中。
不仅仅是常见的项目。
Well I had only half of the solution implemented.
What fixed it for me was adding this to BOTH the common AND iOS projects.
Not only the common project.