对SignalR保持活跃的ping做出反应

SignalR服务器应用程序是否可以对SignalR内部使用的保持活动的ping作出反应?

我正在开发一个应用程序,它将为信号器客户端执行昂贵的查询 . 查询不会在与服务器连接的计算机相同的计算机上执行 . 查询运行起来很昂贵,并且易于重新启动,因此执行工作的工作人员不希望为断开连接的客户端或无法访问或关闭服务器工作;他们希望保证客户仍在那里 . 这可以通过简单地让客户端以某个间隔ping Web服务器来完成,然后Web服务器可以将ping传递给worker .

public class PingedHub : Hub
{
    private readonly IPingListener _listener;

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

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

SignalR already does this . 为了检测丢失的连接,如果在 GlobalHost.Configuration.KeepAlive 配置的时间段内没有传输其他流量,SignalR将发送保持活动ping . 如果它在 GlobalHost.Configuration.ConnectionTimeout 配置的较大时间段内没有收到任何流量,则会断开客户端连接并引发 OnDisconnected .

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

回答(1)

2 years ago

无需挂钩SignalR连接系统 . ping不会多余;如果您的客户端发送ping至少与 GlobalHost.Configuration.KeepAlive 一样频繁,则SignalR将不会发送自己的保持活动ping .

如果您确实找到了挂钩SignalR系统的方法,那么您将面临一个新问题 . 当有其他流量时,不会发送保持活动的ping,但您的工作人员仍然想知道客户端仍然活着 . 如果通信渠道由于某些其他原因而处于活动状态,则您必须选择向具有ping的工作人员发送垃圾邮件,或者使用某个中间系统来限制它们 .