UWP应用中C# Dns.GetHostAddresses()解析带协议主机名失败求助
解决UWP应用中DNS解析带URL前缀失败的问题
问题根源
System.Net.Dns.GetHostAddresses()是用来解析纯主机名的(比如www.example.com),不是带协议前缀的完整URL(比如https://www.example.com)。当你把带https://的完整URL传进去时,它会把整个字符串当作主机名去查询,自然找不到对应的IP记录,所以抛出SocketException。
解决方案
这里有两种实用的解决方式,更推荐第二种,因为更贴合你最终发起请求的需求:
1. 从URL中提取主机名再解析
用Uri类拆分URL,提取出纯主机名后再交给DNS解析:
string targetUrl = "https://www.example.com"; Uri uri = new Uri(targetUrl); // 提取出纯主机名:www.example.com string hostName = uri.Host; IPAddress[] ipAddresses = System.Net.Dns.GetHostAddresses(hostName); // 此时ipAddresses[0]会返回你hosts里配置的192.168.1.187
2. 直接用HttpClient发起请求(推荐)
如果你最终目的是向https://www.example.com发起请求,完全不需要手动做DNS解析。HttpClient会自动拆分URL中的协议、主机名部分,并且会遵守hosts文件的映射规则,直接用完整URL发起请求即可:
using (HttpClient client = new HttpClient()) { try { HttpResponseMessage response = await client.GetAsync("https://www.example.com"); response.EnsureSuccessStatusCode(); // 确保请求返回成功状态码 string responseContent = await response.Content.ReadAsStringAsync(); // 在这里处理返回的响应内容 } catch (HttpRequestException ex) { // 处理请求异常,比如网络问题、SSL证书错误等 Debug.WriteLine($"请求失败: {ex.Message}"); } }
补充说明
- 浏览器能正常加载是因为它会自动处理URL的拆分,只把主机名传给DNS解析,所以能命中hosts的映射。
- UWP应用使用
HttpClient时,记得在Package.appxmanifest中配置对应的网络权限(比如Internet (Client)),否则会出现请求权限不足的问题。
内容的提问来源于stack exchange,提问作者Shashi kumar S
相关产品推荐
相关产品推荐

