SignalR 未触发 "disconnected" 事件

SignalR not firing "disconnected" event

我正在使用 SignalR 将更新推送到连接的 Web 客户端。我监听 disconnected 事件是为了知道什么时候应该开始我的重新连接逻辑

$.connection.hub.disconnected(function() {
    // Initiate my own reconnection logic
});

SignalR 中心托管在 IIS 中(连同我的网站)

[assembly: OwinStartup(typeof(Startup))]
namespace MyNamespace.SignalR
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

连接后,客户端调用服务器方法加入群组

public class MyHub : Hub
{
    public void JoinGroup(string groupName)
    {
        Groups.Add(Context.ConnectionId, groupName);
    }
}

然后我给这个群推送消息:

context.Clients.Group(groupName).sendMessage();

如果我在 IIS 中手动回收应用程序池,SignalR 会开始尝试重新连接,如果失败(超时后),我最终会在客户端收到一个 disconnected 事件。

但是,我的问题是,如果我在 IIS 中手动重启网站,我根本不会收到任何 disconnected 事件,而且我在日志中也看不到 SignalR 检测到任何连接问题根本。我怎样才能检测到我已断开连接?

我知道我可能应该以某种方式保留组连接,因为我猜它保存在内存中。但这不应该影响客户端没有收到断开连接通知的初始问题吗?客户端信号器代码不应该抛出某种 exception/event 吗?

disconnected 当内置的重新连接逻辑超时时首先触发。您还需要收听 recconect 事件,就像我在这里做的那样

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/blob/ReconnectOnClosed/SignalR.EventAggregatorProxy.Client.JS/jquery.signalR.eventAggregator.js#L157

所以我终于找到了问题所在以及如何解决。一些背景:

目前,我们通过转到 IIS 网站下的 "Basic settings..." 并将 "Physical Path" 从 C:\websites\version1 更改为 C:\websites\version2 来手动发布应用程序的新版本。显然,这给出了与在 IIS 中重新启动网站相同的行为(不是硬重置,不停止网站,不回收应用程序池)并且根据 this"does NOT shut the site down, it merely removes the Http.sys binding for that port"。而且无论我们等待多长时间,已连接的客户端都不会收到任何指示它们应该重新连接的指示。

所以解决办法就是每次release后回收application pool。 "lost" 客户端将收到断开连接的事件并重新连接到站点的新版本。