SignalR没有触发“断开连接”事件

时间:2015-06-16 14:59:13

标签: asp.net iis asp.net-mvc-5 signalr signalr.client

我正在使用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检测到任何连接问题。如何检测到我已断开连接?

我知道我应该以某种方式坚持群组连接,因为我猜想它会保存在内存中。但这不应该影响客户端没有收到断线通知的初始问题?客户端信号器代码不应该抛出某种异常/事件吗?

2 个答案:

答案 0 :(得分:3)

当重新连接的内置逻辑超时时,

disconnected首先触发。你还需要听一下recconect事件,就像我在这里做的那样

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

答案 1 :(得分:0)

所以我终于找到了问题是什么以及如何解决它。虽然有一些背景知识:

目前我们通过转到"基本设置..."手动发布应用程序的新版本。在IIS的网站下,改变了物理路径"从C:\websites\version1C:\websites\version2。显然,这与在IIS中重新启动网站(不是硬重置,不停止网站,不回收应用程序池)以及根据this提供的行为相同:"不会关闭网站,它只是删除该端口的Http.sys绑定" 。无论我们等待多久,连接的客户端都不会收到任何他们应该重新连接的指示。

因此解决方案是在每次发布后回收应用程序池。 "失去"客户端将收到断开连接的事件并重新连接到新版本的网站。