我在Azure上有2个插槽的Web应用程序。
每当插槽交换发生时,所有SignalR客户端都会断开连接,甚至没有通知连接丢失。
在客户端上永远不会触发诸如Close,Error,Reconnected之类的SignalR事件。
如何防止这种情况或者至少知道何时发生断开连接? (当然我需要避免投票)
答案 0 :(得分:1)
如何防止这种情况或者至少知道何时发生断开连接?
我们可以启用SignalR跟踪来查看有关SignalR应用程序中事件的诊断信息。如何为SignalR服务器和客户端启用和配置跟踪,我们可以参考此document。
检测断开连接的原因
SignalR 2.1为服务器OnDisconnect事件添加了一个重载,指示客户端是故意断开连接而不是超时。如果客户端明确关闭连接,则StopCalled参数为true。在JavaScript中,如果服务器错误导致客户端断开连接,则错误信息将作为$ .connection.hub.lastError传递给客户端。
C#服务器代码:stopCalled参数
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
if (stopCalled)
{
Console.WriteLine(String.Format("Client {0} explicitly closed the connection.", Context.ConnectionId));
}
else
{
Console.WriteLine(String.Format("Client {0} timed out .", Context.ConnectionId));
}
return base.OnDisconnected(stopCalled);
}
JavaScript客户端代码:在disconnect事件中访问lastError。
$.connection.hub.disconnected(function () {
if ($.connection.hub.lastError)
{ alert("Disconnected. Reason: " + $.connection.hub.lastError.message); }
});
我们可以参考Detecting the reason for a disconnection了解更多细节。
如何防止这种情况?
我们可以不断重新连接它。
在某些应用程序中,您可能希望在连接丢失并重新连接尝试超时后自动重新建立连接。为此,您可以从Closed事件处理程序(JavaScript客户端上的已断开事件处理程序)调用Start方法。您可能希望在调用Start之前等待一段时间,以避免在服务器或物理连接不可用时过于频繁地执行此操作。以下代码示例适用于使用生成的代理的JavaScript客户端。
$.connection.hub.disconnected(function() {
setTimeout(function() {
$.connection.hub.start();
}, 5000); // Restart connection after 5 seconds.
});
了解更多细节