什么可以阻止 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}");
}
}

如果我在此函数的顶部放置一个断点,则永远不会调用它。当我以正常方式关闭或退出应用程序时,它被称为 fine。

根据: https://learn.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/handling-connection-lifetime-events 它说。

如果客户端应用程序或其运行的计算机崩溃 或进入睡眠状态(例如,当用户关闭笔记本电脑时(,即 服务器未被告知发生了什么。就服务器而言 知道,客户端丢失可能是由于连接 中断,客户端可能正在尝试重新连接。因此 在这些情况下,服务器等待给客户端一个机会 重新连接,并且 On断开连接直到断开连接才会执行 超时期限到期(默认约为 30 秒(。

关于默认在30 秒后调用OnDisconnected的说法对我来说似乎并不成立。任何关于找出我在设置中可能出错的地方的帮助将不胜感激。

在我的创业公司里.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;
}

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

相关内容

最新更新