2015-06-16 61 views
3

我正在使用SignalR将更新推送到连接的Web客户端。我听,以便在disconnected事件,知道什么时候应该开始SignalR不会触发“断开”事件

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

我知道,我也许应该坚持的组连接莫名其妙,因为这是保存在内存中,我猜。但是,这不应该影响客户没有收到断开通知的初始问题?客户端信号员代码不应该抛出某种异常/事件?第一

回答

0

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

同时,我们要通过手动释放我们的应用程序的新版本,现在“基本设置...”在IIS网站和改变“物理路径”从C:\websites\version1C:\websites\version2下。显然,这给出了同样的行为,因为这样做在IIS网站的重启(不硬复位,不停止网站,不可回收的应用程序池),并按照this“不会关闭网站了,它只是删除Http.sys绑定该端口“。无论等待多久,连接的客户端都不会收到任何需要重新连接的指示。

因此,解决办法是每次发布后回收应用程序池。 “丢失”的客户端将收到断开的事件并重新连接到新版本的站点。

3

disconnected火灾时,内置的逻辑重新连接已超时。您还需要听recconect事件,像我一样在这里

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

+0

好的,我会看看你的代码。但是,如果我关闭应用程序池,则在信号器重新连接逻辑超时后约30秒后会收到断开连接。如果我停止了网站,我从来没有得到过这个事件,看起来,信号器重新连接逻辑从来没有启动过。 – Joel

+0

Dissconnect事件应该触发后没尝试重新连接,您可以访问Chrome控制台,你会看到失败的尝试 – Anders

+0

嗯注意到,标签是错误在我联系,现在的代码应该更容易阅读 – Anders