【发布时间】: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}");
}
}
如果我在这个函数的顶部设置一个断点,它就永远不会被调用。当我以正常方式关闭或退出我的应用程序时,它被称为正常。
如果客户端应用程序或运行它的计算机崩溃 或进入睡眠状态(例如,当用户关闭笔记本电脑时), 服务器不知道发生了什么。至于服务器 知道,客户端的丢失可能是由于连接 中断并且客户端可能正在尝试重新连接。所以, 在这些情况下,服务器等待给客户端一个机会 重新连接,并且 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