System.Net.Dns 類別提供簡單的 DNS 解析功能,是網路程式開發的基礎工具。本文整理其核心靜態方法、參數說明,並提供常見使用情境的完整程式碼範例。
| 方法 | 說明 | 回傳型別 |
|---|---|---|
GetHostAddresses(string) | 解析主機名或 IP 字串,回傳所有 IP 位址 | IPAddress[] |
GetHostEntry(string) | 解析主機名或 IP,回傳完整 IPHostEntry (含主機名、別名、位址清單) | IPHostEntry |
GetHostName() | 取得本機主機名稱 | string |
Resolve(string) | 已過時,建議改用 GetHostEntry | IPHostEntry |
BeginGetHostAddresses / EndGetHostAddresses | 非同步版本 | IAsyncResult / IPAddress[] |
最常用的方法,直接回傳 IP 位址陣列。支援 IPv4 與 IPv6。
IPAddress[] ips = Dns.GetHostAddresses("www.google.com");
foreach (var ip in ips)
Console.WriteLine(ip); // 可能輸出多個 IPv4/IPv6 位址
取得更豐富的 IPHostEntry 物件,包含:
HostName:標準主機名稱Aliases:別名陣列AddressList:IP 位址陣列IPHostEntry entry = Dns.GetHostEntry("localhost");
Console.WriteLine($"主機名: {entry.HostName}");
Console.WriteLine($"位址數: {entry.AddressList.Length}");
取得本機 DNS 主機名稱,不需參數。
string localName = Dns.GetHostName();
Console.WriteLine($"本機名稱: {localName}");
using System;
using System.Net;
public class DnsQueryDemo
{
public static void Main()
{
Console.Write("請輸入主機名或 IP: ");
string input = Console.ReadLine().Trim();
try
{
// 1. 解析取得 IPHostEntry
IPHostEntry hostEntry = Dns.GetHostEntry(input);
Console.WriteLine($"\n=== 解析結果 ===");
Console.WriteLine($"標準主機名: {hostEntry.HostName}");
Console.WriteLine($"別名清單: {(hostEntry.Aliases.Length > 0 ? string.Join(", ", hostEntry.Aliases) : "無")}");
Console.WriteLine($"IP 位址清單:");
foreach (IPAddress ip in hostEntry.AddressList)
{
Console.WriteLine($" {ip} ({ip.AddressFamily})");
}
}
catch (SocketException ex)
{
Console.WriteLine($"DNS 解析失敗: {ex.Message} (錯誤碼: {ex.SocketErrorCode})");
}
catch (ArgumentException ex)
{
Console.WriteLine($"輸入格式錯誤: {ex.Message}");
}
}
}
BeginGetHostEntry/EndGetHostEntry 或 Task.Run(() => Dns.GetHostEntry(...)) 避免阻塞主執行緒。DnsCache 相關設定調整,或呼叫 Dns.RefreshCache() (需 .NET Core 3.1+ / .NET 5+) 強制刷新。GetHostAddresses 同時回傳 IPv4 與 IPv6,篩選時可用 ip.AddressFamily == AddressFamily.InterNetwork (IPv4) 或 InterNetworkV6 (IPv6)。