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 事件,就像我在这里做的那样
所以我终于找到了问题所在以及如何解决。一些背景:
目前,我们通过转到 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" 客户端将收到断开连接的事件并重新连接到站点的新版本。
我正在使用 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 事件,就像我在这里做的那样
所以我终于找到了问题所在以及如何解决。一些背景:
目前,我们通过转到 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" 客户端将收到断开连接的事件并重新连接到站点的新版本。