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?
答案 0 :(得分:5)
无需挂钩SignalR连接系统。 ping不会多余;如果您的客户端发送ping至少与GlobalHost.Configuration.KeepAlive
一样频繁,则SignalR将不会发送自己的保持活动ping。
如果您确实找到了挂钩SignalR系统的方法,那么您将面临一个新问题。当有其他流量时,不会发送保持活动的ping,但是您的工作人员仍然想知道客户端仍然活着。如果通信渠道由于某些其他原因而处于活动状态,则您必须选择向使用ping的工作人员发送垃圾邮件,或者使用一些中间系统来限制它们。