我正在使用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检测到任何连接问题。如何检测到我已断开连接?
我知道我应该以某种方式坚持群组连接,因为我猜想它会保存在内存中。但这不应该影响客户端没有收到断线通知的初始问题?客户端信号器代码不应该抛出某种异常/事件吗?
答案 0 :(得分:3)
disconnected
首先触发。你还需要听一下recconect事件,就像我在这里做的那样
答案 1 :(得分:0)
所以我终于找到了问题是什么以及如何解决它。虽然有一些背景知识:
目前我们通过转到"基本设置..."手动发布应用程序的新版本。在IIS的网站下,改变了物理路径"从C:\websites\version1
到C:\websites\version2
。显然,这与在IIS中重新启动网站(不是硬重置,不停止网站,不回收应用程序池)以及根据this提供的行为相同:"不会关闭网站,它只是删除该端口的Http.sys绑定" 。无论我们等待多久,连接的客户端都不会收到任何他们应该重新连接的指示。
因此解决方案是在每次发布后回收应用程序池。 "失去"客户端将收到断开连接的事件并重新连接到新版本的网站。