Preamble
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.
My setup
- 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
That’s it.
The Concept
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.
The Execution
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
OnBeforeRequest
function and add the following condition:
if (oSession.host.toLowerCase() == "192.168.1.108:8888") oSession.host = "localhost:5867";
Just modify the
192.168.1.108
IP to be your VM’s IP and change5867
to be Cassini’s port - Fire up cmd.exe and renew your IP by doing an ipconfig/release followed by ipconfig/renew
You’re done!
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
http://192.168.1.108:8888
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.
Closing
There have to be more devs out there running a Windows VM in their Mac, needing to test their web apps in OS X, on their iPod Touch/iPhone/iPad, Blackberry, yada yada. Yes, this could all be solved by using the dev or QA server but those aren’t updated automatically and I can’t be bothered to make a build every time I want to tweak some JavaScript. I’m marking this down as an exercise in learning about VM networking types, reverse proxy functionality and the power of releasing and renewing your DHCP license.
Hi,
You are not the only dev trying to connect to cassini in a vm from the iphone simulator. I’m trying this out now.
Thank you for taking the trouble to post this.
Henry
what i am trying to do is to connect the iphone to mojoportal running on vm with windows server hope u provide new post.
This is awesome, thanks for posting.