动态域名解析, 或 DNSR, 通常用于解析 IP 地址经常变化的域名. 电信网络提供了公网 IP, 给广大程序员远程办公, 内容分享等方面带来了极大的便利. 但公网 IP 是动态的, 它会经常变化, 因此通过 IP 的方式访问非常不友好. 因此就需要引入 "花生壳" 等动态域名解析工具, 这类解析工具限制很多, 如免费版只能使用指定的二级域名, 解析的各类很少, 域名数量有限制等等.
还好我们有. NET!(和阿里云) 通过简短的几行. NET 代码, 即可轻松完成动态域名解析.
动态域名解析的过程
第一步 知道自己的 IP 地址
第二步 更新 DNS 的 IP 解析值
获取自己的 IP 地址
现在网上有许多网站, 服务或者 API 可以快速获取自己的 IP 地址, 如随手在百度上可以找到 http://www.ip138.com/ , 国外还有 https://www.ipify.org/ 等服务, 都挺好用. 这些服务. NET 也可以做, 只需几行简短的代码, 然后部署到服务器上:
- async Task Main()
- {
- await webHost
- .CreateDefaultBuilder()
- .UseStartup<UserQuery>()
- .Build()
- .RunAsync();
- }
- public void ConfigureServices(IServiceCollection services) {}
- public void Configure(IApplicationBuilder App) =>
- App.Run(ctx => ctx.Response.WriteAsync(ctx.Connection.RemoteIpAddress.ToString()));
我已经将该代码部署到了服务器上, 域名是: https://echo-ip.starworks.cc/ , 可供有需要的朋友测试.
更新 DNS 解析值
各大域名网站都有自己的 DNS 解析 API 或者 SDK, 阿里云也不例外, 我可以通过几行简短的 C# 代码即可更新 DNS 解析值:
- // 安装 NuGet 包: aliyun.NET-sdk-alidns
- string currentIp = new WebClient().DownloadString("https://echo-ip.starworks.cc/");
- var client = new DefaultAcsClient(DefaultProfile.GetProfile("", Util.GetPassword("aliyun_dns_access_key"), Util.GetPassword("aliyun_dns_secret_key")));
- var domainRecords = client.GetAcsResponse(new DescribeDomainRecordsRequest
- {
- DomainName = "starworks.cc",
- RRKeyWord = "cool",
- }).DomainRecords;
- DescribeDomainRecordsResponse.DescribeDomainRecords_Record homeRecord = domainRecords.First(x => x.RR == "cool");
- if (homeRecord._Value != currentIp)
- {
- client.GetAcsResponse(new UpdateDomainRecordRequest
- {
- RecordId = homeRecord.RecordId,
- RR = homeRecord.RR,
- Type = homeRecord.Type,
- _Value = currentIp,
- });
- }
然后将该脚本添加到电脑的开机启动项, 这样每次开机时, 即可确保我的 cool.starworks.cc 为最新的本地 IP 了.
阿里云的 SDK 设计有点取巧了, 客户端 DefaultAcsClient 只有一个方法: GetAcsResponse<T>(T request), 这样一来不太方便, 可以调用哪些方法不能一目了然, 二来还会让调用方感觉很迷惑, 明明是更新操作, 为什么要调用 Get?
与此相比, 腾讯云提供的 SDK 就人性化很多, 虽然我的域名绑定在阿里云上.
不是 80 端口怎么办?
默认是不允许
80
/
443
端口开放外网的, 因此即使有动态域名绑定, 以后发给客户时, 网址里面也带一个长长的端口名, 如:
https://cool.starworks.cc:44300
. 在 DNS 记录类型中, 有多种方式解决这个问题, 可以指定为 SRV 或者显性 URL, 隐性 URL 来解决这个问题:
这个过程可以通过 C# 代码完成, 代码如下:
- client.GetAcsResponse(new AddDomainRecordRequest
- {
- DomainName = "starworks.cc",
- RR = "cool",
- Type = "SRV",
- _Value = "0 5 44403 home.starworks.cc",
- }
这样一来, 只需在浏览器中输入: http://cool.starworks.cc, 即可自动显示我 http://home.starworks.cc:44403 的内容:
总结
文中的 "祖传代码" 链接如下, 可随意下载使用, 用 LINQPad 打开:
管理界面:
动态 DNS:
其中管理界面运行效果如下:
使用时将我的 starworks.cc 域名换成你的即可.
说来其实我不太关心. NET 以后会发展成什么样子, 相比之下, 我更关心我立马能用. NET 做出什么来..NET Core 3.0 已经发布, 其新功能还没来得及细看, 但. NET 当下能提供给我的想象力就已经非常丰富了, 这可能就是我心中的 "自由": 只要探索, 总会有新的发现.
来源: https://www.cnblogs.com/sdflysha/p/20190927-dotnet-dynamic-domain-resolution.html