C#调用阿里云接口实现动态域名解析,支持IPv6(Windows系统下载可用)

电信宽带一般能申请到公网IP,但是是动态的,基本上每天都要变,所以想到做一个定时任务,随系统启动,网上看了不少博文很多都支持IPv4,自己动手写了一个。

(私信可全程指导)

部署步骤:

1、下载软件包,修改配置文件

下载地址:私信获取

下载压缩包,解压后修改配置文件AliDDNS.exe.config中的阿里云帐号和自己的域名。

2、修改脚本,并运行脚本

将“安装服务.bat”和“卸载服务.bat”脚本中的可执行文件路径,改为自己的软件包所在路径,然后右键“安装服务.bat”进行安装服务。

执行脚本后会将定时服务添加到系统服务中。

3、启动服务

右键“此电脑”,点击“管理”进入计算机管理窗口,在服务列表中找到上一步新增的服务,然后启动。即可定时更新阿里云解析记录,实现动态IP的DDNS。

源代码:


/// <summary>
/// 刷新阿里云域名解析记录
/// </summary>
private void RefreshAliRecord()
{string recordTypes = ConfigurationManager.AppSettings["RecordTypes"];if (string.IsNullOrWhiteSpace(recordTypes)){NLogHelper.WriteLog(typeof(AliDDNS), "配置文件中的“待解析的协议类型”不能为空。", NLogLevel.Warn);return;}string regionId = ConfigurationManager.AppSettings["RegionId"];string accessKeyID = ConfigurationManager.AppSettings["AccessKeyID"];string accessKeySecret = ConfigurationManager.AppSettings["AccessKeySecret"];string domainName = ConfigurationManager.AppSettings["DomainName"];string rR = ConfigurationManager.AppSettings["RR"];string[] rRTypes = rR.Split('|');// regionId:地区节点// accessKeyID:阿里云Key// accessKeySecret:阿里云密钥AlibabaCloudCredentialsProvider provider = new AccessKeyCredentialProvider(accessKeyID, accessKeySecret);IClientProfile profile = DefaultProfile.GetProfile(regionId);DefaultAcsClient client = new DefaultAcsClient(profile, provider);List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record> recordList = DescribeDomainRecords(client, domainName);string[] recordTypeArray = recordTypes.Split('|');foreach (string recordType in recordTypeArray){if (recordType == "A"){#region IPv4解析记录try{string urls = ConfigurationManager.AppSettings["GetIPFromUrl"];string ipv4 = CommonHelper.GetExtranetIP(urls.Split('|').ToList());if (string.IsNullOrWhiteSpace(ipv4)){NLogHelper.WriteLog(typeof(AliDDNS), "未获取到外网IPv4地址!", NLogLevel.Warn);return;}if (IsAddSuccessLog){NLogHelper.WriteLog(typeof(AliDDNS), "获取到的外网IPv4地址为:" + ipv4, NLogLevel.Info);}foreach (string rRItem in rRTypes){if (string.IsNullOrWhiteSpace(rRItem)){continue;}List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record> ipv4Records = recordList.Where(r => r.Type == recordType && r.RR == rRItem).ToList();if (ipv4Records == null || ipv4Records.Count() == 0){AddDNSRecord(client, domainName, rRItem, recordType, ipv4);}else{#region 更新解析记录// 非ipv4记录List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record> otherRecords = ipv4Records.Where(r => r._Value != ipv4).ToList();// ipv4记录List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record> tempList = ipv4Records.Where(r => r._Value == ipv4).ToList();if (tempList == null || tempList.Count == 0){// 如果不存在该IPv4的记录,则删除所有记录ipv4Records,并新增记录AddDNSRecord(client, domainName, rRItem, recordType, ipv4);DeleteDNSRecord(client, ipv4Records);}else if (tempList.Count == 1)  // 如果只存在一条该IPv4记录,则记录日志,如果有其他记录则删除{NLogHelper.WriteLog(typeof(AliDDNS), string.Format("同类型(“{0}”类型)的解析记录(IPv4:{1})已存在,无需更新!", rRItem, ipv4), NLogLevel.Info);if (ipv4Records.Count != tempList.Count){// 存在其他记录,则删除其他记录otherRecordsDeleteDNSRecord(client, otherRecords);}}else{// 如果存在多条该IPv4记录,则取第一条,其他的记录都删除tempList.RemoveRange(0, 1);otherRecords.AddRange(tempList);DeleteDNSRecord(client, otherRecords);}#endregion}}}catch (Exception ex){NLogHelper.WriteLog(typeof(AliDDNS), "查询并更新IPv4解析记录时异常:" + ex.ToString(), NLogLevel.Warn);}#endregion}else if (recordType == "AAAA"){#region IPv6解析记录try{List<string> ipv6List = CommonHelper.GetLocalIPv6();if (ipv6List == null || ipv6List.Count() == 0){NLogHelper.WriteLog(typeof(AliDDNS), "未获取到本机IPv6地址!", NLogLevel.Warn);return;}if (IsAddSuccessLog){NLogHelper.WriteLog(typeof(AliDDNS), "获取到的本地IPv6地址为:" + string.Join(",", ipv6List), NLogLevel.Info);}string defaultIPv6 = ipv6List[0];  // 默认只添加第一个IPv6地址foreach (string rRItem in rRTypes){if (string.IsNullOrWhiteSpace(rRItem)){continue;}List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record> ipv6Records = recordList.Where(r => r.Type == recordType && r.RR == rRItem).ToList();if (ipv6Records == null || ipv6Records.Count() == 0){AddDNSRecord(client, domainName, rRItem, recordType, defaultIPv6);}else{#region 更新解析记录// 非ipv6记录List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record> otherRecords = ipv6Records.Where(r => r._Value != defaultIPv6).ToList();// ipv6记录List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record> tempList = ipv6Records.Where(r => r._Value == defaultIPv6).ToList();if (tempList == null || tempList.Count == 0){// 如果不存在该IPv6的记录,则删除所有记录ipv6Records,并新增记录AddDNSRecord(client, domainName, rRItem, recordType, defaultIPv6);DeleteDNSRecord(client, ipv6Records);}else if (tempList.Count == 1)  // 如果只存在一条该IPv6记录,则记录日志,如果有其他记录则删除{NLogHelper.WriteLog(typeof(AliDDNS), string.Format("同类型(“{0}”类型)的解析记录(IPv6:{1})已存在,无需更新!", rRItem, defaultIPv6), NLogLevel.Info);if (ipv6Records.Count != tempList.Count){// 存在其他记录,则删除其他记录otherRecordsDeleteDNSRecord(client, otherRecords);}}else{// 如果存在多条该IPv6记录,则取第一条,其他的记录都删除tempList.RemoveRange(0, 1);otherRecords.AddRange(tempList);DeleteDNSRecord(client, otherRecords);}#endregion}}}catch (Exception ex){NLogHelper.WriteLog(typeof(AliDDNS), "查询并更新IPv6解析记录时异常:" + ex.ToString(), NLogLevel.Warn);}#endregion}}
}// 获取指定主域名的所有解析记录列表
public List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record> DescribeDomainRecords(DefaultAcsClient client, string domainName)
{List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record> records = new List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record>();try{DescribeDomainRecordsRequest request = new DescribeDomainRecordsRequest();request.DomainName = domainName;记录类型 官网支持A/CNAME/MX/AAA/TXT/NS/SRV/CAA/URL隐性(显性)转发如果有需要可将该值配置为参数传入//request.Type = recordType;try{DescribeDomainRecordsResponse response = client.GetAcsResponse(request);if (IsAddSuccessLog){NLogHelper.WriteLog(typeof(AliDDNS), "查询到的解析记录:" + System.Text.Encoding.Default.GetString(response.HttpResponse.Content), NLogLevel.Info);}if (response.DomainRecords != null){records = response.DomainRecords;}}catch (Exception ex){NLogHelper.WriteLog(typeof(AliDDNS), "调用DescribeDomainRecords接口时发生异常:" + ex.ToString(), NLogLevel.Error);}}catch (Exception ex){NLogHelper.WriteLog(typeof(AliDDNS), "创建DescribeDomainRecords接口调用对象时发生异常:" + ex.ToString(), NLogLevel.Error);}return records;
}// 新增解析记录
public void AddDNSRecord(DefaultAcsClient client, string domainName, string rRItem, string recordType, string ipValue)
{#region 新增解析记录string recordStr = string.Format("(RR:{0},Type:{1},Value:{2})", rRItem, recordType, ipValue);try{var request = new AddDomainRecordRequest();request.DomainName = domainName;request.RR = rRItem;request.Type = recordType;request._Value = ipValue;request.TTL = 600;  // 免费版,默认600秒,10分钟var response = client.GetAcsResponse(request);if (IsAddSuccessLog){NLogHelper.WriteLog(typeof(AliDDNS), string.Format("新增解析记录{0}时接口返回内容:{1}", recordStr, Encoding.Default.GetString(response.HttpResponse.Content)), NLogLevel.Info);}}catch (Exception ex){NLogHelper.WriteLog(typeof(AliDDNS), string.Format("新增解析记录{0}时发生异常:{1}", recordStr, ex.ToString()), NLogLevel.Error);}#endregion
}// 删除解析记录
public void DeleteDNSRecord(DefaultAcsClient client, List<DescribeDomainRecordsResponse.DescribeDomainRecords_Record> deleteList)
{#region 删除解析记录foreach (DescribeDomainRecordsResponse.DescribeDomainRecords_Record record in deleteList){string recordStr = string.Format("(RR:{0},Type:{1},Value:{2})", record.RR, record.Type, record._Value);try{DeleteDomainRecordRequest request = new DeleteDomainRecordRequest();request.RecordId = record.RecordId;DeleteDomainRecordResponse response = client.GetAcsResponse(request);if (IsAddSuccessLog){NLogHelper.WriteLog(typeof(AliDDNS), string.Format("删除解析记录{0}时接口返回内容:{1}", recordStr, Encoding.Default.GetString(response.HttpResponse.Content)), NLogLevel.Info);}}catch (Exception ex){NLogHelper.WriteLog(typeof(AliDDNS), string.Format("删除解析记录{0}时发生异常:{1}", recordStr, ex.ToString()), NLogLevel.Error);}}#endregion
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285982.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ServletFilterListenerMybatis预编译生命周期

目录 0x00 前言 0x01 Servlet&路由&生命周期 0x02 JDBC&Mybatis 0x03 预编译 SQL 0x04 Filter 过滤器 0x05 Listener 监听器 0x00 前言 很久没有更新 CSDN 博客了&#xff0c;原因是搭建了个人博客网站&#xff0c;但现在决定还是同步到 CSDN 希望和各位大…

轻量级购物小程序H5产品设计经典样例

主要是看到这个产品设计的不错值得借鉴特记录如下&#xff1a; 不过大多数购物app都大致相同&#xff0c;这个算是经典样例&#xff0c;几乎都可以复制&#xff0c;我第一次使用&#xff0c;感觉和顺畅。看上去产品是经过打磨的&#xff0c;布局非常好。内容也很丰富。支持异业…

强大的电子书阅读器:OmniReader Pro for mac

&#x1f50d; OmniReader Pro 是一款专为 Mac 设计的强大阅读工具&#xff0c;它能够帮助你更高效地阅读和处理各种文本内容。无论是电子书、新闻文章、网页文本还是文件资料&#xff0c;OmniReader Pro 都能胜任&#xff01; ✅ OmniReader Pro 提供了丰富的功能&#xff0c…

如何在华为云上购买ECS及以镜像的方式部署华为云欧拉操作系统 (HCE OS)

写在前面 工作中遇到&#xff0c;简单整理博文内容为 华为云开发者认证 实验笔记https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在…

时序图聚类关联算法

时序图聚类关联算法 A time resolved clustering method revealing longterm structures and their short-term internal dynamics 一种揭示长期结构及其短期内动力学的时间分辨聚类方法 arxiv2019 源码&#xff1a; https://github.com/t4d-gmbh/MajorTrack/tree/master https…

k8s集群内部署nexus

一、前言 在k8s集群中部署nexus服务需要使用到pv、pvc服务来存储nexus的数据&#xff0c;需要使用service服务来提供对外访问nexus服务的端口&#xff0c;需要使用deployment服务来管理nexus服务&#xff0c;接下来就是用这些服务来在k8s集群中搭建nexus&#xff0c;pv服务使用…

elementui中的el-table,当使用fixed属性时,table主体会遮挡住滚动条的大半部分,导致很难选中。

情况&#xff1a; 解决&#xff1a; table加个类&#xff0c;这里取为class"table" 然后是样式部分&#xff1a; <style scoped lang"scss"> ::v-deep.table {// 滚动条高度调整::-webkit-scrollbar {height: 15px;}// pointer-events 的基本信息…

Manacher算法(马拉车)

Manacher&#xff08;马拉车&#xff09;算法 作用&#xff1a;在On的时间复杂度下&#xff0c;求出字符串每个回文中心的最长回文半径 回文半径&#xff1a;以回文中心为起点&#xff0c;到回文串两端的距离 如&#xff1a;# a # b # a # 以b为回文中心&#xff0c;最长回文半…

windows安装conda小环境 windows安装anaconda python jupyter anaconda

windows安装anaconda之后&#xff0c;再安装本地的jupyter 1 如果想体验在线版的jupyter&#xff0c;可以访问anaconda在Anaconda Cloud&#xff0c;需要注册github&#xff1a; 1 下载anaconda &#xff0c;并安装 1.1 下载 或者去清华镜像下载 Free Download | Anacondah…

python案例教程,python简单案例

这篇文章主要介绍了python案例教程&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 据说Python之父-Guido Van Rossum打算让CPython更快&#xff0c;速度直接翻五倍&#xff0c…

C# Tcplistener,Tcp服务端简易封装

文章目录 前言相关文章前言设计代码简单使用运行结果 前言 我最近有个需求要写Tcp服务端&#xff0c;我发现Tcp服务端的回调函数比较麻烦&#xff0c;简化Tcp的服务&#xff0c;我打算自己封装一个简单的Tcp服务端。 相关文章 C# TCP应用编程三 异步TCP应用编程 C# Tcpclient…

Linux本地搭建StackEdit Markdown编辑器结合内网穿透实现远程访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…