public async Task <LocalIpHistory> SaveIpInfo(string ip, string lastIp) { if (string.IsNullOrEmpty(ip)) { throw new Exception("保存IP信息失败,当前IP不能为空。"); } LocalIpHistory ipHistory = new LocalIpHistory() { IP = ip, LastIP = lastIp, UpdateTs = TimeUtil.Timestamp() }; using (CustumDbContext db = new CustumDbContext()) { ipHistory = db.LocalIpHistory.Add(ipHistory).Entity; //自动删除24h之前的数据 if (ConfigManager.Now.AppSettings.IsEnableAutoClearHistoryIP) { string sql = $"DELETE FROM {nameof(LocalIpHistory)} WHERE {nameof(LocalIpHistory.UpdateTs)} < {TimeUtil.Timestamp() - 24 * 60 * 60}"; await db.Database.ExecuteSqlRawAsync(sql); } if (await db.SaveChangesAsync() > 0) { return(ipHistory); } else { throw new Exception($"保存IP数据失败,IP:{ip}"); } } }
public async Task <LocalIpHistory> GetLastIpInfo() { using (CustumDbContext db = new CustumDbContext()) { LocalIpHistory ipHistory = await db.LocalIpHistory.OrderByDescending(c => c.UpdateTs).FirstOrDefaultAsync(); return(ipHistory); } }
static async void Start() { Log.Info("Ddns service starting."); bool isFirst = ConfigManager.Now.DdnsConfig.IsEnableDdns; while (!token.IsCancellationRequested) { try { LocalIPInfo ipHelper = new LocalIPInfo(); string ip = await ipHelper.GetLocalIp(); Log.Info($"当前网络环境外网IP:{ip}"); if (isFirst) { isFirst = false; if (ConfigManager.Now.DdnsConfig.IsEnableDdns) { new DomainDdnsService().UpdateDomainInfo(ip); } else { Log.Info($"DDNS服务已关闭,跳过初次启动更新IP地址。"); } } LocalIpHistory lastIp = await dataManager.GetLastIpInfo(); if (lastIp == null || lastIp.IP != ip) await DoDifferentAction(ip, lastIp == null ? "0.0.0.0" : lastIp.IP); else Log.Info($"当前网络环境外网IP[{ip}]未发生变化。"); if (await dataManager.SaveIpInfo(ip, lastIp == null ? "0.0.0.0" : lastIp.IP) != null) Log.Info($"当前IP[{ip}]已记录。"); await Delay(); } catch (TaskCanceledException) { break; } catch (Exception ex) { Log.Warn(ex.Message, ex); await Delay(); } } }