Я делаю простую кроссплатформенную игру и хочу использовать 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.