About a month ago I started the creation of an ASP.NET MVC 3 app to a buddy. I’ll write some blog posts in the near future sharing my experiences with this awesome web framework. This app I’m still developing is a web application that I develop using my "new” computer. Today I use Mac OS as my main operating system and since I’m using ASP.NET I also need to use Windows.
One of the things I wanted to do during the development was seeing how the app would look like when viewed in a different OS, in this case, I’d like to see it running in Mac OS as if I were an end user accessing the app. This is good to test how the app behaves when it’s viewed in a different environment, that is, the perspective/environment of the end user, and not the developer’s perspective/development environment.
It’s cool to see the app running in a different OS and different web browsers. In Mac OS I have the chance of testing it against Safari too. I also have the chance of seeing how exceptions are being handled. There are certain types of errors that only happen when the end user is using the app in his environment. I think you know that already. This kind of testing allows me to deliver a better user experience.
When the app is accessed from the Mac side, the first difference is mainly visual because my Win 7 VM has all visual effects (clear type) disabled and so things look really simple if compared to Mac OS. I’m running the VM with no visual effects so that I have a somewhat fast VM to do the development. I only have 4 GB RAM available and I have to share it with both operating systems. I thought 4 GB RAM would suffice but that’s not the case. I have already ordered 8 GB RAM but am eagerly waiting it arrive from US. That’s another story that I plan to write in other blog post.
The reason I’m writing this post is that things don’t work at first when you try to access in Mac your app that is running in Windows VM. To get things working from both sides ( host = Mac OS and VM = Windows 7 ) they must see/communicate with each other. That’s where I had to do some work to get things going. So here are some instructions of what you need do:
1 - Set a fixed IP address for Windows VM
Set up a fixed IP address (read this page for a complete guide) in your Windows 7 virtual machine. This will make it easy when you need to access your app from Mac OS side. You won’t need to take note of different IP addresses handled by the DHCP server each time you restart your VM.
Figure 1 - Windows7 VM with fixed IP address
Above I have given the IP 192.168.1.106 to the VM. As I do not have a lot of devices connected to my wireless router, this IP is just fine.
2 - Set Virtual Machine’s Network Type
In your Parallels VM devices bar set your network type (orange arrow) as bridged:
Figure 2 - Parallels Desktop VM devices toolbar
3 - Test Communication between Host and VM
Make sure both operating systems can see each other.
Open Mac OS Terminal and execute a ping command:
Change the IP with the IP you have in your Windows VM.
You should see something like this:
Figure 3 - Mac OS Terminal pinging Windows 7 VM
Now, open Windows 7 Command Prompt and ping Mac IP address. To see your Mac IP address go to System Preferences. Under Internet & Wireless, select Network.
Figure 4 - Mac OS IP address
Let’s ping 192.168.1.100:
Figure 5 - Windows 7 VM Command Prompt pinging Mac
As you see, both computers can see/communicate with each other. This means that the Network is working as expected.
4 - Configure Windows VM webserver for external traffic
What address should you type in a Mac OS browser to access the app? Well, this needs a little bit of caring. You’ll probably fail when trying to access the app with the same address you use in Windows side.
I’m using IIS Express as the web server in Windows. You can install it using Microsoft WebMatrix. IIS Express is by default configured to only server internal traffic (Windows VM). As I’m trying to access it from an external environment (Mac OS), I needed to configure it. The first link bellow was the main doc that helped me:
Basically I had to configure HTTP.SYS, create a URL binding that allow me to access the app in Mac side and disable Windows Firewall for my private home network.
4.1 - Configure HTTP.SYS
Type this command in Windows command prompt:
netsh http add urlacl url=http://leniel-pc:7777/ user=everyone
Change the url in the above command according to your desired configuration.
Note: the above command requires elevation. Right click the command prompt shortcut and select Run as administrator.
4.2 - Configure URL binding
As mentioned in the 2nd doc referenced above you must open your applicationhost.config file and add URL bindings that fit your needs. Mine is located here:
Take a look at the last binding I have added:
<site name="FitnessCenter" id="3">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\Users\Leniel\Documents\Visual Studio 2010\Projects\FitnessCenter\FitnessCenter.Web" />
<binding protocol="http" bindingInformation="*:7777:leniel-pc" />
<binding protocol="http" bindingInformation="*:7777:localhost" />
<binding protocol="http" bindingInformation=":7777:leniel-pc" />
<binding protocol="http" bindingInformation="192.168.1.106:7777:"/>
4.3 - Configure Windows VM firewall
The last step is disabling Windows VM firewall for your Home or work private networks.
Figure 6 - Windows 7 VM Firewall
As I just use this virtual machine to do software development, it’s ok to me to disable the firewall. Be careful though.
5 - Access Win 7 VM web app in Mac OS
After all this configuration you should be able to browse your app externally.
To see if everything is working, open a browser in Mac OS and try to access the app typing something as this in my case:
Hope it helps.