应使用 HTTP 接口(如 https://api.ipify.org)获取公网 IP,因 Dns.GetHostEntry 和 NetworkInterface 等本地 API 仅返回内网地址;推荐 HttpClient GET 请求,设超时 3000ms 并捕获异常。

直接调用公开 HTTP 接口是最简单、最可靠的方式,不需要解析网页、不依赖本地网络配置,也不需要管理员权限。
为什么不能用 Dns.GetHostEntry 或 NetworkInterface 获取外网 IP
这两类 API 只能拿到本机在局域网内的 IP(比如 192.168.x.x 或 10.x.x.x),它们根本不知道路由器做了 NAT,更看不到运营商分配的公网 IP。试图从本地网卡或 DNS 反查,结果一定是错的。
-
Dns.GetHostEntry(Dns.GetHostName())返回的是内网地址或localhost -
NetworkInterface.GetAllNetworkInterfaces()列出的都是物理/虚拟网卡的私有 IP - 即使你家宽带真有公网 IP,它也只出现在路由器 WAN 口,不在你的 C# 进程可见范围内
推荐用 GET 请求调用轻量 HTTP 接口(如 https://api.ipify.org)
这类服务专为“返回纯文本公网 IP”设计,响应快、无 CORS 限制、无需 Token,适合后台静默调用。
- 用
HttpClient发起 GET,响应体就是一串 IPv4 地址(如203.205.12.45),不用 JSON 解析 - 超时建议设为
3000毫秒,避免卡死;加try/catch捕获HttpRequestException和TaskCanceledException - 别用
WebClient(已标记为过时),也别手动拼HttpWebRequest(冗余且易错) - 示例代码片段:
using var client = new HttpClient();
var ip = await client.GetStringAsync("https://api.ipify.org"); // 返回 "203.205.12.45"备用接口与注意事项
单一接口可能临时不可用,建议准备 1–2 个 fallback,但注意响应格式是否一致。
-
https://icanhazip.com和https://ifconfig.me/ip行为类似,都返回纯文本 IP -
https://api64.ipify.org返回 IPv6,若只要 IPv4 就别用它 - 所有接口都走 HTTPS,如果目标环境禁用 TLS 1.2+,需提前设置
ServicePointManager.SecurityProtocol - 别用带广告或重定向的网站(比如某些“IP 查询工具页”),HTML 解析极易断裂
真正的难点从来不是“怎么发请求”,而是处理超时、重试、DNS 失败这些网络不确定性——接口本身再简单,没包住异常就等于没写完。










