Невозможно установить тайм-аут соединения для. NET SignalR Client HubConnection (do tnet core / signalr 2.2) - PullRequest
2 голосов
/ 09 января 2020

Я использую. NET клиент SignalR (SignalR Core 2.2 и Do tNet Core 2.2) в фоновой службе. В моем l oop я проверяю, отключен ли мой объект подключения, и если да, запускаю ConnectAsyn c.

. Я пытаюсь использовать SignalR для обнаружения сбоя высокой доступности (среди прочих такие вещи, как config syn c), поэтому время, в течение которого удаленный хост отключается или становится недоступным, имеет решающее значение.

Проблема, с которой я столкнулся, заключается в том, что на Linux таймауты не кажется, отвечает правильно. В то время как у меня все настраиваемые тайм-ауты установлены на очень короткое агрессивное время в секундах, при работе на Linux это занимает несколько минут. У Windows, похоже, нет такой же проблемы.

if (_connection.State != HubConnectionState.Connected) {
    _connection = new HubConnectionBuilder()
        .ConfigureLogging(logging => {
            logging.SetMinimumLevel(LogLevel.Information);
            logging.AddConsole();
        })
        .WithUrl("https://" + settings.RemoteIP + ":" + settings.RemotePort + "/api/hub/ha", options => {
            options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets | Microsoft.AspNetCore.Http.Connections.HttpTransportType.ServerSentEvents;
            options.AccessTokenProvider = () => Task.FromResult(settings.RemoteJWT);         
            options.CloseTimeout = new TimeSpan(0, 0, 8);                       
        })
        .Build();

    _connection.HandshakeTimeout = new TimeSpan(0, 0, 5);
    _connection.ServerTimeout = new TimeSpan(0, 0, 10);
    _connection.KeepAliveInterval = new TimeSpan(0, 0, 5);

    _connection.On("ExampleEvent", async () =>
    {
        await ExampleProcessor(_logger, cancellation);
    });

    await _connection.StartAsync(cancellation);
}                               

Ровно через 120 секунд после попытки подключения к недоступному серверу я получаю следующую ошибку тайм-аута:

System.OperationCanceledException: The operation was canceled. at 
System.Net.Http.HttpClient.HandleFinishSendAsyncError(Exception e, CancellationTokenSource cts) at 
System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts) at 
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.NegotiateAsync(Uri url, HttpClient httpClient, ILogger logger) at 
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.GetNegotiationResponseAsync(Uri uri) at 
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.SelectAndStartTransport(TransferFormat transferFormat) at 
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsyncCore(TransferFormat transferFormat) at 
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsync(TransferFormat transferFormat, CancellationToken cancellationToken) at 
Microsoft.AspNetCore.SignalR.Client.HttpConnectionFactory.ConnectAsync(TransferFormat transferFormat, CancellationToken cancellationToken) at 
Microsoft.AspNetCore.SignalR.Client.HttpConnectionFactory.ConnectAsync(TransferFormat transferFormat, CancellationToken cancellationToken) at 
Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncCore(CancellationToken cancellationToken) at 
Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsync(CancellationToken cancellationToken) 

На Windows время ожидания истекает ровно 21 секунда, но с другой ошибкой:

System.Net.Http.HttpRequestException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond ---> System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken) --- End of inner exception stack trace --- at 
System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken) at 
System.Threading.Tasks.ValueTask`1.get_Result() at 
System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Threading.Tasks.ValueTask`1.get_Result() at 
System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask`1 creationTask) at System.Threading.Tasks.ValueTask`1.get_Result() at 
System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken) at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at 
Microsoft.AspNetCore.Http.Connections.Client.Internal.AccessTokenHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at Microsoft.AspNetCore.Http.Connections.Client.Internal.LoggingHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at 
System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts) at 
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.NegotiateAsync(Uri url, HttpClient httpClient, ILogger logger) at 
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.GetNegotiationResponseAsync(Uri uri) at 
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.SelectAndStartTransport(TransferFormat transferFormat) at 
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsyncCore(TransferFormat transferFormat) at Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.StartAsync(TransferFormat transferFormat, CancellationToken cancellationToken) at 
Microsoft.AspNetCore.SignalR.Client.HttpConnectionFactory.ConnectAsync(TransferFormat transferFormat, CancellationToken cancellationToken) at 
Microsoft.AspNetCore.SignalR.Client.HttpConnectionFactory.ConnectAsync(TransferFormat transferFormat, CancellationToken cancellationToken) at 
Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncCore(CancellationToken cancellationToken) at 
Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsync(CancellationToken cancellationToken)

Правильно ли я настроил время ожидания? Или есть основная проблема с Do tNet Core SignalR 2.2?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...