Using a Mac is great. You can pry mine from my cold, dead hands. However, there are times I need to run things in a Windows VM. It’s easiest to do as much work as possible in VM but there’s the unavoidable need to connect remote machines to the guest server.
In my specific case I am part of a team developing a C# app so that means Visual Studio 2008 and its built-in development server, Cassini. Microsoft added this lovely hard-coded trick to Cassini so that it listens only to requests from the loopback, localhost. This is supposedly to prevent developers from shipping apps with Cassini built in. I don’t care about the reason. I care that I can’t connect to my development VM on my Mac or any other remote machine. There is a fairly simple solution to that, though.
- OS X 10.6.3
- VMware Fusion 3.0.2
- Windows 7 Professional
- Visual Studio 2008
- VPN’d connection to the office
Yes, it’s wonky to VPN in my VM but I can’t VPN in my Mac and that’s a whole other story.
What you’ll need
Fiddler is a debugging proxy but it also has the ability to be a reverse proxy. We’re going to use that feature to take requests to the guest VM on Fiddler’s port of
8888 and automatically reroute them to Cassini’s port.
First thing’s first: my particular setup is probably unique and the tedious steps I’m about to list will likely never be needed by the average developer. However, if I need them that tells me someone else does as well so this is bound to help some lucky Googler.
- Make sure your VM’s network connection is running in Bridged mode
- Start your Cassini server by going to Visual Studio in your guest VM and pressing ctrl+F5
- Fire up Fiddler and open Tools->Options
- In the Connections tab make sure “Allow remote computers to connect” is checked and hit OK to close the options window
- Press ctrl+r to open the rules (defaults to opening it in notepad.exe)
- Search for the
OnBeforeRequestfunction and add the following condition:
if (oSession.host.toLowerCase() == "192.168.1.108:8888") oSession.host = "localhost:5867";
Just modify the
192.168.1.108IP to be your VM’s IP and change
5867to be Cassini’s port
- Fire up cmd.exe and renew your IP by doing an ipconfig/release followed by ipconfig/renew
Testing your work
Now that Fiddler is set up to route requests to Cassini you can go to any machine on your local network, type in your VM’s IP followed by Fiddler’s port and Fiddler will accept your request, route it to Cassini and return back results. In case you need to copy and paste something the path in my browser is simply
Ways to improve this
There’s an additional rule that can be added to Fiddler. In the
OnBeforeResponse add the condition “
oSession.utilReplaceInResponse("localhost:5867","192.168.1.108:8888");“. That does what it sounds like. You may have noted the magic numbers in the Fiddler rules. These will suck to maintain. You can right-click your web solution, go to properties, click the Web tab and assign a specific port. If you go to your Windows network settings and force in an IP you’ll never have to edit the rules file again. However, these are hack solutions around a weak implementation.
A potentially better route would be to ditch Cassini altogether and use UltiDev, a free .NET server. I may still. Should get around these headaches fairly well.
The best option would be to run IIS in your VM. For an as-yet-undiagnosed reason my web solution will not allow me to run it through IIS. I hope you, casual reader, have more luck.