Что может помешать OnDisconnectedAsync вызываться для клиентов, которые постыдно отключаются? - PullRequest
0 голосов
/ 20 сентября 2018

Когда клиент постыдно отключается (например, отрыв кабеля, сбой или пропадание интернета).OnDisconnectedAsync на сервере никогда не вызывается.Я ждал более 15 минут с точкой останова внутри функции.

Я использую Microsoft.AspNetCore.SignalR (1.0.2).

Мое приложение размещается как Azure App Service.

Это моя функция отключения:

   public override async Task OnDisconnectedAsync(Exception exception)
    {
        try
        {
            if (_accountContextIDMap.TryGetValue(Context.ConnectionId, out int accountID))
            {
                ClientRequest_UserLoggedOut(accountID);
            }

            Logger.Write($"{Context.ConnectionId} Disconnected");
            await base.OnDisconnectedAsync(exception);
        }
        catch (Exception ex)
        {
            Logger.Write($"{ex.Message}\n{ex.StackTrace}");
        }
    }

Если я сижу точку останова в верхней части этой функции, этоникогда не звонил.Это называется нормально, когда я закрываю или закрываю свое приложение в обычном порядке.

В соответствии с: https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/handling-connection-lifetime-events в нем говорится.

Если клиентское приложение или компьютерчто он работает при сбоях или переходит в спящий режим (например, когда пользователь закрывает ноутбук), сервер не информируется о том, что произошло.Насколько сервер знает, потеря клиента может быть связана с прерыванием соединения, и клиент может пытаться восстановить соединение.Поэтому в этих сценариях сервер ожидает, чтобы дать клиенту шанс на повторное подключение, и OnDisconnected не выполняется, пока не истечет период ожидания отключения (по умолчанию около 30 секунд).

Оператор о OnDisconnected вызов через 30 секунд по умолчанию не кажется мне правдоподобным.Буду признателен за любую помощь в выяснении, где я мог ошибиться при настройке.

В моем Startup.cs

public void ConfigureServices(IServiceCollection services)
{
     ...
     services.AddSignalR();
     ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseSignalR(route => { route.MapHub<GameHub>("/gameHub", GameHubConfigureOptions); });
    ...
}

private void GameHubConfigureOptions(HttpConnectionDispatcherOptions options)
{
    options.Transports = HttpTransportType.WebSockets;
}

1 Ответ

0 голосов
/ 19 октября 2018

В ASP.NET Core 2.1 серверы SignalR не контролируют своих клиентов, чтобы узнать, все ли они активны.Клиенты делают контролируют серверы, но не наоборот.Мы добавили эту поддержку в ASP.NET Core 2.2, хотя (предварительный просмотр 3 только что выпущен ).В 2.2 клиент отправляет эхо-запрос на сервер, и если сервер некоторое время не получал ответа от клиента, он должен пометить клиента как отключенного и запустить это событие.

...