
.NET does not have a built-in mechanism for querying DNS records; nevertheless, this is a use case that is required relatively often.
With the help of the NuGet package DnsClient (Apache License), however, handling the query is very simple:
1using DnsClient;
2using DnsClient.Protocol;
3
4string domain = "schwabencode.com";
5
6LookupClient lookup = new();
7
8// Helper to perform and display a query
9async Task QueryAndPrint(QueryType type)
10{
11 Console.WriteLine($"\n=== {type} Records ===");
12 IDnsQueryResponse result = await lookup.QueryAsync(domain, type);
13
14 foreach (DnsResourceRecord? dnsRecord in result.AllRecords)
15 {
16 switch (dnsRecord)
17 {
18 case ARecord a:
19 Console.WriteLine($"A: {a.Address} (TTL: {a.InitialTimeToLive}s)");
20 break;
21 case AaaaRecord aaaa:
22 Console.WriteLine($"AAAA: {aaaa.Address} (TTL: {aaaa.InitialTimeToLive}s)");
23 break;
24 case CNameRecord cname:
25 Console.WriteLine($"CNAME: {cname.CanonicalName} (TTL: {cname.InitialTimeToLive}s)");
26 break;
27 case MxRecord mx:
28 Console.WriteLine($"MX: {mx.Exchange} (Pref: {mx.Preference}, TTL: {mx.InitialTimeToLive}s)");
29 break;
30 case NsRecord ns:
31 Console.WriteLine($"NS: {ns.NSDName} (TTL: {ns.InitialTimeToLive}s)");
32 break;
33 case TxtRecord txt:
34 Console.WriteLine($"TXT: {string.Join(" ", txt.Text)} (TTL: {txt.InitialTimeToLive}s)");
35 break;
36 default:
37 Console.WriteLine($"{dnsRecord}");
38 break;
39 }
40 }
41}
42
43// Query each type
44await QueryAndPrint(QueryType.A);
45await QueryAndPrint(QueryType.AAAA);
46await QueryAndPrint(QueryType.CNAME);
47await QueryAndPrint(QueryType.MX);
48await QueryAndPrint(QueryType.NS);
49await QueryAndPrint(QueryType.TXT);
Conclusion
With just a few lines of C# and the powerful DnsClient.NET library, you can build a versatile DNS lookup tool. Whether you’re troubleshooting, monitoring, or integrating into larger applications, this console app gives you a solid foundation.
Feel free to experiment, extend, and customize it to fit your needs!

Comments