<

Resolving Remote Windows Azure IP Addresses

Published on
10,434 Points
4,334 Views
1 Endorsement
Last Modified:
Approved
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
Comment
0 Comments

Featured Post

Cloud Class® Course: Amazon Web Services - Basic

Are you thinking about creating an Amazon Web Services account for your business? Not sure where to start? In this course you’ll get an overview of the history of AWS and take a tour of their user interface.

Join & Write a Comment

Did you know PowerShell can save you time with SaaS platforms? Simply leverage RESTfulAPIs to build your own PowerShell modules. These will kill repetitive tickets and tabs, using the command Invoke-RestMethod. Tune into this webinar to learn how…
Key to your CPU's ability to stay cool is to use the right amount of thermal paste and apply it correctly. In other words you want as much thermal conductivity between CPU and the cooling block. Use a quality thermal paste and apply it in a manner…

Keep in touch with Experts Exchange

Tech news and trends delivered to your inbox every month