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