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