当客户端断开连接(例如电缆拉动,崩溃或互联网掉线)时,该连接不正常。永远不会调用服务器上的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}");
}
}
如果我在此函数的顶部放置一个断点,就永远不会调用它。当我以正常方式关闭或退出应用程序时,这称为正常。
如果客户端应用程序或其正在运行的计算机崩溃 或进入睡眠状态(例如,当用户关闭笔记本电脑时), 服务器未获悉发生了什么。至于服务器 知道,客户端的丢失可能是由于连接 中断,客户端可能正在尝试重新连接。因此, 在这些情况下,服务器会等待为客户端提供机会 重新连接,并且直到断开连接后才执行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;
}
答案 0 :(得分:2)
在ASP.NET Core 2.1中,SignalR服务器不监视其客户端以查看它们是否仍处于活动状态。客户端执行监视服务器,但反之则不行。不过,我们在ASP.NET Core 2.2中添加了此支持(预览3 just released)。在2.2版本中,客户端ping服务器,如果一段时间未收到客户端的消息,则应将客户端标记为已断开并触发此事件。