【问题标题】:What could be stopping OnDisconnectedAsync from being called for clients who disconnect disgracefully?什么可能会阻止 OnDisconnectedAsync 为可耻地断开连接的客户端调用?
【发布时间】:2018-09-20 15:19:07
【问题描述】:

当客户端可耻地断开连接时(例如电缆拉断、崩溃或互联网掉线)。永远不会调用服务器上的 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;
}

【问题讨论】:

  • 你在使用 IIS 吗?
  • 没有。我正在使用 Azure 应用服务。
  • 好的,确实使用 IIS。
  • 我错误地假设您的意思是 IIS 作为虚拟/物理服务器的一部分,我可以在其中访问标准 IIS 界面和控件。
  • 您所指的文档是旧的 SignalR - 这是完全不同的。虽然它可能仍然成立,但我不太确定。

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


【解决方案1】:

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

【讨论】:

  • 我在 .NET Core 3 上,但仍然没有命中
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2014-04-20
  • 1970-01-01
相关资源
最近更新 更多