Resolving Remote Windows Azure IP Addresses

Kelvin McDanielIndependent Consultant
CERTIFIED EXPERT
Published:
Today I had a very interesting conundrum that had to get solved quickly. Needless to say, it wasn't resolved quickly because when we needed it we were very rushed, but as soon as the conference call was over and I took a step back I saw the correct answer immediately. Good old IPAddress(). <-- Not really.  =/   Why not?  

The crux of the issue is this: IPAddress in the .NET Framework v4.x has no way to resolve a host name back to a valid IP address. You have to use the DNS class instead.

Here's the problem:
Whenever I ran the following code it always threw the following exception:
var targetHostAddress = "http://myStagingSubDomain.cloudapp.net";
                      var ipAddresses = Dns.GetHostAddresses(targetHostAddress); <-- exception was being thrown here...
                      var ipAddress = ipAddresses[0];
                      
                      using (var client = new TcpClient())
                      {
                          client.Connect(ipAddress, port);
                          Console.WriteLine("{0}Connected to {1}:{2}.", Environment.NewLine, ipAddress.ToString(), port.ToString());
                      }

Open in new window

The Exception:
No such host is known --> System.Net.Sockets.SocketError.HostNotFound

Great. Then I realized that it just might be because I was including the address as presented in the browser... so what if I shaved off the protocal and trailing slash? Eureka! That worked!

All's good then, right? Nope. You have to do just a little more juggling to accomodate the possible peculiarities in your network/subdomain/whatever. How do I know this? Because when substituted "localhost" or "127.0.0.1" for the address I still got the exception : "No connection could be made because the target machine actively refused it 127.0.0.1:4201"

Ok, Here's The Scenario:
1. We are deploying a service with multiple TCP/IP listeners to Windows Azure.
2. One of those listeners is the target.
3. We know Windows Azure IP addresses are subject to change without warning.
4. We also know that eventually that switching could be "on purpose", or rather the result of load balancing and not security/maintenance.
5. We need to find the IP address automatically and without human interaction.
6. We need to be able to test the solution locally, then deploy it to the cloud without changing anything but the targetHostAddress.
var targetHostAddress = "localhost"; // "{substitute_your_windows_azure_host_name_instead_here--don't_include_the_protocol_or_trailing_slash}";
                      var ipAddresses = Dns.GetHostAddresses(targetHostAddress);
                      var ipAddress = !targetHostAddress.Contains("localhost") ? ipAddresses[0] : ipAddresses[1];

Open in new window

... notice the host name test in the 3rd line? That's important (at least in my office anyway...), because ipAddress[0] was actually "::1", NOT "127.0.0.1" like I expected. For the life of me I couldn't figure out why I kept getting that exception until I added a few more breakpoints. Never assume that would should be is... trust, but verify.

I hope this saves you some valuable time. I know it would've saved me at least an hour between deployments and testing.  =/
1
4,789 Views
Kelvin McDanielIndependent Consultant
CERTIFIED EXPERT

Comments (0)

Have a question about something in this article? You can receive help directly from the article author. Sign up for a free trial to get started.