
.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!
Related articles

- 11 min read
Containerizing .NET in 2026 Without a Dockerfile
Most .NET Dockerfiles repeat the same five steps: restore, publish, select the matching Microsoft runtime image, copy the output and start …

- 12 min read
Problem Details in ASP.NET Core and .NET 11
builder.Services.AddProblemDetails() registers infrastructure. It does not create an error contract. An ASP.NET Core request can fail during …

- 11 min read
Resilience in .NET with Microsoft.Extensions.Resilience
Retries are the most visible resilience strategy and the easiest one to misuse. Repeating a failing call can recover from a short network …
Let's Work Together
Looking for an experienced Platform Architect or Engineer for your next project? Whether it's cloud migration, platform modernization or building new solutions from scratch - I'm here to help you succeed.
