SignalR客户端在Azure插槽上断开连接

问题描述 投票:0回答:1

我在Azure上有2个插槽的Web应用程序。

每当插槽交换发生时,所有SignalR客户端都会断开连接,甚至不会通知连接丢失。

从不在客户端上触发诸如Close,Error,Reconnected之类的SignalR事件。

如何防止这种情况或者至少知道何时发生断开连接? (当然我需要避免投票)

signalr azure-web-sites signalr.client
1个回答
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.
});

更多细节我们可以参考How to continuously reconnect

© www.soinside.com 2019 - 2024. All rights reserved.