C# 信号器-已断开连接的呼叫太迟

C# 信号器-已断开连接的呼叫太迟,c#,server,signalr,connection-timeout,C#,Server,Signalr,Connection Timeout,我有一个自托管的Signalr2.2.0服务器,并使用OWIN进行配置 [assembly: OwinStartup(typeof(Server.Communication.StartUp))] namespace Server.Communication { public class StartUp { public void Configuration(IAppBuilder app) { app.Map("/Commu

我有一个自托管的Signalr2.2.0服务器,并使用OWIN进行配置

[assembly: OwinStartup(typeof(Server.Communication.StartUp))]
namespace Server.Communication
{
    public class StartUp
    {
        public void Configuration(IAppBuilder app)
        {
            app.Map("/Communication", map =>
            {
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration { EnableDetailedErrors = true};
                map.RunSignalR(hubConfiguration);
            });
        }
    }
}
我正在通过启动服务器

WebApp.Start($"http://{ip}:{port}");
在我的
Hub
中,我重写了该方法

public override Task OnDisconnected(bool stopCalled)
如果我让我的客户端通过windows任务资源管理器崩溃以模拟崩溃,则一切正常,并调用
OnDisconnected
方法。但是,
OnDisconnected
方法调用有点晚。至少还有30秒才能调用该方法。我想把这个时间设为10秒

在调用
WebApp.Start
方法之前,我尝试设置
KeepAlive
ConnectionTimeout
,但没有改变任何内容

GlobalHost.Configuration.ConnectionTimeout = new TimeSpan(0, 0, 10);
GlobalHost.Configuration.KeepAlive = new TimeSpan(0, 0, 2);

可靠地检测断开的插座是真正困难的问题之一;唯一可行的方法是可靠地偶尔接收数据(通常通过服务器启动的ping)。断开的插座通常无法检测到,并且不会以“死”的形式出现在仍然活着的一端,因此,如果在预期的时间间隔内没有收到它们的消息,通常只需在超时的情况下杀死它们。显然,您不希望不断发送“我还在这里”、“我还在这里”、“我还在这里”,因此套接字关闭检测中的一些延迟是固有的,也是不可避免的。谢谢您的详细回答。是的,我不想发送“我还在这里”的消息。是否没有其他方法来指定我的服务器在调用
OnDisconnected
方法之前等待的时间跨度?服务器没有等待-它只是不知道连接已断开。好,谢谢您提供的信息。如果连接不正确地关闭,服务器等待重新连接,如果客户端在DeNeltTimeTime2中不重新连接,服务器将考虑连接死,并调用断开连接。