对SignalR作出反应,保持活动ping



SignalR服务器应用程序可以对内部使用的keepalive ping作出反应吗?

我正在开发一个应用程序,它将为信号客户端执行昂贵的查询。查询不会在服务器连接的同一台机器上执行。查询的运行成本很高,而且很容易重新启动,因此工作人员不希望为断开连接的客户端或无法访问或停机的服务器工作;他们希望确保客户仍然在那里。这可以简单地通过让客户端每隔一段时间ping web服务器,然后web服务器可以将ping传递给工作器来完成。

public class PingedHub : Hub
{
    private readonly IPingListener _listener;
    public Hub(IPingListener listener)
    {
        _listener = listener;
    }
    public Ping()
    {
        _listener.Ping(Context.ConnectionId);
    }
}

SignalR已经这样做了。为了检测丢失的连接,如果在一段时间内没有其他流量传输,SignalR会发送keepalive ping(由GlobalHost.Configuration.KeepAlive配置)。如果在GlobalHost.Configuration.ConnectionTimeout配置的较长时间内没有收到任何流量,则断开客户端连接并引发OnDisconnected

是否有可能钩到现有系统以获得客户端连接的积极保证,或者客户端需要发送冗余ping?

不需要挂接SignalR连接系统。ping信号不会是多余的;如果你的客户端发送ping至少和GlobalHost.Configuration.KeepAlive一样频繁,SignalR将不会发送它自己的keepalive ping。

如果你真的找到了连接SignalR系统的方法,你将面临一个新的问题。当有其他流量时,不会发送keepalive ping,但是您的工作人员仍然希望知道客户端仍然活着。如果通信通道由于某些其他原因而处于活动状态,则必须在使用ping向工人发送垃圾邮件或使用一些中间系统来限制它们之间做出选择。

最新更新