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

Cir*_*dec 3 signalr

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

SignalR已经这样做了.为了检测丢失的连接,如果在一段时间内没有传输其他流量,SignalR会发送一个Keep-Alive ping GlobalHost.Configuration.KeepAlive.如果在更大的时间段内没有收到任何流量(由配置GlobalHost.Configuration.ConnectionTimeout,则会断开连接并断开连接)OnDisconnected.

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

Cir*_*dec 5

无需挂钩SignalR连接系统.ping不会多余; 如果你的客户端至少发送ping命令GlobalHost.Configuration.KeepAlive,SignalR将不会发送自己的保持活动ping.

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