是什么导致阻止以可耻的方式断开连接的客户端调用OnDisconnectedAsync?

时间:2018-09-20 15:19:07

标签: c# disconnect asp.net-core-signalr

当客户端断开连接(例如电缆拉动,崩溃或互联网掉线)时,该连接不正常。永远不会调用服务器上的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 :(得分:2)

在ASP.NET Core 2.1中,SignalR服务器不监视其客户端以查看它们是否仍处于活动状态。客户端执行监视服务器,但反之则不行。不过,我们在ASP.NET Core 2.2中添加了此支持(预览3 just released)。在2.2版本中,客户端ping服务器,如果一段时间未收到客户端的消息,则应将客户端标记为已断开并触发此事件。