Что могло помешать вызову OnDisconnectedAsync для клиентов, которые досадно отключаются?

Когда клиент с позором отключается (например, выдергивание кабеля, сбой или пропадание интернета). 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;
}

person steve    schedule 20.09.2018    source источник
comment
Вы используете IIS?   -  person davidfowl    schedule 21.09.2018
comment
Нет. Я использую службу приложений Azure.   -  person steve    schedule 21.09.2018
comment
Хорошо, что действительно использует IIS.   -  person davidfowl    schedule 21.09.2018
comment
Я сделал неверное предположение, что вы имели в виду IIS как отдельный виртуальный / физический сервер, на котором у меня есть доступ к стандартному интерфейсу и элементам управления IIS.   -  person steve    schedule 22.09.2018
comment
Документация, на которую вы ссылаетесь, - это старый SignalR, который совершенно другой. Возможно, это все еще верно, но я не уверен.   -  person thab    schedule 28.09.2018


Ответы (1)


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

person Andrew Stanton-Nurse    schedule 19.10.2018
comment
Я использую .NET Core 3, и он все еще не попадает - person p3tch; 26.03.2021