Xamarin (android) с SignalR Core не может подключиться к концентратору с помощью веб-сокета - PullRequest
0 голосов

Я делаю простую кроссплатформенную игру и хочу использовать SignalR (ASP. Net core 3.1). Я установил пакет nuget - Microsoft.AspNetCore.SignalR.Client. Все сработало, как ожидалось, но потом я понял, что клиент Android (9.0) не использует веб-сокет. Затем я написал на сервере следующий код:

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<GamesControlHub>("/hubs/GamesControlHub", options => {
                options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets;
            });
        });

Также я добавил следующий код в класс клиента

        connection = new HubConnectionBuilder()
            .WithUrl(baseAddress + HUB_ROUTE, HttpTransportType.WebSockets)
            .Build();

После этого клиент android не может установить sh подключение к стороне сервера. Исключение ошибки не возникает, просто ожидая выполнения кода:

        await connection.StartAsync();

Однако клиент Windows может установить sh соединение с сервером без каких-либо проблем со своим кодом. Для android я поменял транспорт и все заработало. Я также попытался разместить сервер и телефон в одной локальной сети.

Этот файл содержит код Startup.cs, а также код сервера и клиентского концентратора: Git gist

Используя логирование получил следующее:

08-08 22:56:15.251 D/Mono    ( 5906): Found as 'mono_btls_ssl_ctx_set_max_version'.
[0:] Microsoft.AspNetCore.Http.Connections.Client.HttpConnection: Error: Failed to start connection. Error starting transport 'WebSockets'.

  System.Net.WebSockets.WebSocketException (0x80004005): The WebSocket request or response contained unsupported header(s).
  at               
  System.Net.WebSockets.WebSocketHandle.ParseAndValidateConnectResponseAsync (System.IO.Stream stream, System.Net.WebSockets.ClientWebSocketOptions options, System.String expectedSecWebSocketAccept, System.Threading.CancellationToken cancellationToken) [0x000c2] 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:329 
  at System.Net.WebSockets.WebSocketHandle.ConnectAsyncCore (System.Uri uri, System.Threading.CancellationToken cancellationToken, System.Net.WebSockets.ClientWebSocketOptions options) [0x00383] 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:148 
  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.StartAsync (System.Uri url, Microsoft.AspNetCore.Connections.TransferFormat transferFormat, System.Threading.CancellationToken cancellationToken) [0x001f2] in <423f070b588e409c9c3d9e7dcff65f90>: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) [0x00097] in <423f070b588e409c9c3d9e7dcff65f90>:0 
 08-08 22:56:15.668 D/Mono    ( 5906): DllImport searching in: 'libmono-btls-shared' ('./libmono-btls-shared.so').

Покопавшись в топах c понял, что проблема возникает при использовании протокола https.

...