You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无固定IP的远程客户端如何向服务端发送心跳信号,最简实现方式是什么?

最简实现方案:HTTP定时心跳上报

完全匹配你当前的网络限制(客户端无固定IP只能主动发请求),开发成本极低,不需要引入额外框架。

客户端改造(现有Windows服务直接加逻辑即可)

  • 在你现有的Windows服务中新增定时任务,频率建议设为1小时/次,上报内容仅需两个字段:客户端唯一标识(可使用设备SN、MAC或你预先分配的设备ID)、当前时间戳
  • 直接用.NET自带的HttpClient发送POST请求即可,请求失败无需额外处理,下次定时任务自动重试,仅需记录错误日志方便排查
  • 代码示例:
// 全局静态初始化HttpClient,避免重复创建产生套接字资源浪费
private static readonly HttpClient _httpClient = new HttpClient();

// 定时执行的心跳上报方法
async Task SendHeartbeatAsync(string deviceId)
{
    try
    {
        var postContent = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("device_id", deviceId),
            new KeyValuePair<string, string>("timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString())
        });
        await _httpClient.PostAsync("https://你的服务端域名/api/heartbeat", postContent);
    }
    catch (Exception ex)
    {
        // 调用你现有服务的日志逻辑记录错误即可
        LogError("心跳上报失败", ex);
    }
}

服务端实现

  • 新增1个简单的HTTP接口接收心跳请求,数据库新增设备心跳表,仅需3个字段:device_id(主键/设备唯一标识)、last_heartbeat_time(最后一次心跳时间)、create_time
  • 接口收到请求后先校验设备ID是否属于合法设备,校验通过后更新对应设备的最后心跳时间即可
  • 每天定时执行一次查询,筛选last_heartbeat_time小于当前UTC时间减24小时的设备,直接对接你现有的邮件告警逻辑发送通知即可
  • 接口逻辑示例:
[HttpPost("api/heartbeat")]
public IActionResult ReceiveHeartbeat([FromForm] string device_id, [FromForm] long timestamp)
{
    // 校验设备是否为你的合法受控设备
    if (!LegalDeviceIds.Contains(device_id))
    {
        return BadRequest("非法设备");
    }
    // 更新心跳时间
    using var dbContext = new YourDbContext();
    var heartbeatRecord = dbContext.DeviceHeartbeats.FirstOrDefault(x => x.DeviceId == device_id);
    if (heartbeatRecord == null)
    {
        dbContext.DeviceHeartbeats.Add(new DeviceHeartbeat
        {
            DeviceId = device_id,
            LastHeartbeatTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime
        });
    }
    else
    {
        heartbeatRecord.LastHeartbeatTime = DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime;
    }
    dbContext.SaveChanges();
    return Ok();
}

方案优势

  • 比SignalR更简单:无需维护长连接、无需处理断连重连逻辑,300台设备的请求量对服务端完全无压力
  • 适配你的网络限制:不需要客户端有固定IP,完全由客户端主动发起请求
  • 开发成本极低:客户端和服务端新增代码量不到100行,无需引入额外依赖,可直接和你现有Windows服务、邮件告警逻辑无缝对接
  • 满足你的监测需求:只要设备超过24小时没有上报心跳,即可判定为离线,1小时的上报频率已经可以把离线时间误差控制在1小时以内,远高于你1天的判断阈值要求

内容的提问来源于stack exchange,提问作者Shay Avitapl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:45:06