响应SignalR的保持活动ping

3
一个SignalR服务器应用程序能够对内部使用的保持活动ping做出反应吗?
我正在开发一个应用程序,为SignalR客户端执行昂贵的查询。这些查询将不会在与服务器连接的同一台机器上执行。这些查询很耗时,但易于重新启动。因此,执行工作的工作者不想为已断开连接的客户端或无法到达或宕机的服务器执行工作;他们希望确保客户端仍然存在。这可以通过简单地让客户端在一定间隔内向Web服务器发送ping来轻松实现,然后Web服务器可以将ping传递给工作者。
public class PingedHub : Hub
{
    private readonly IPingListener _listener;

    public Hub(IPingListener listener)
    {
        _listener = listener;
    }

    public Ping()
    {
        _listener.Ping(Context.ConnectionId);
    }
}

SignalR已经实现了这一点。为了检测失去连接的情况,SignalR会在一段时间内没有其它通信时发送Keep-Alive ping,该时间段由GlobalHost.Configuration.KeepAlive配置。如果在更长的时间段内没有任何通信,由GlobalHost.Configuration.ConnectionTimeout配置,则会断开客户端的连接并触发OnDisconnected事件。

是否可以通过现有系统来确保客户端已连接,或者客户端需要发送冗余ping?

1个回答

5
不需要钩入SignalR连接系统。如果您的客户端发送ping的频率至少与GlobalHost.Configuration.KeepAlive一样,那么这些ping就不会是冗余的,SignalR也不会发送其自己的keep-alive ping。
如果您找到了一种钩入SignalR系统的方法,那么您将面临一个新问题。当有其他流量时,不会发送keep-alive ping,但您的工作人员仍然希望知道客户端仍然活着。如果通信渠道由于其他原因处于活动状态,则必须在向工作人员发送ping之间进行选择,或者放置某些中间系统以对它们进行限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接