Recently, I had to investigate a performance bug on a website when using Internet Explorer 8. Although we are fortunate to have access to BrowserStack for testing, I have not found it particularly efficient for performance investigations, so instead I used an HyperV virtual machine (VM) from modern.IE.
I had started the site under test from Visual Studio 2013 using IIS Express. Unfortunately, HyperV VMs are not able to see such a site out-of-the-box. Three things must be reconfigured first: the VM network adapter, the Windows Firewall of the host machine, and IIS Express.
HyperV VM Network Adapter
In HyperV, select Virtual Switch Manager… from the Actions list on the right-hand side. In the dialog that appears, select New virtual network switch on the left, then Internal on the right, then click Create Virtual Switch. This creates a virtual network switch that allows your VM to see your local machine and vice versa. You can then name the switch anything you want; I called mine LocalDebugNet.
To ensure the VM uses the newly created virtual switch, select the VM and choose Settings… (either from the context menu or the lower-right pane). Choose Add Hardware in the left-hand pane and add a new Network Adapter, then drop down the virtual switch list on the right, choose the switch you created earlier, and click OK to accept the changes and close the dialog.
Now the VM is setup and should be able to see its host machine on its network. Unfortunately, it still cannot see the website under test. Next, we have to configure IIS Express.
IIS Express
Open up a command prompt on your machine (the host machine, not the VM) and run ipconfig /all . Look in the output for the virtual switch that you created earlier and write down the corresponding IP address1.
Open the IIS Express applicationhost.config file in your favourite text editor. This file is usually found under your user profile.
notepad %USERPROFILE%\documents\iisexpress\config\applicationhost.config
Find the website that you are testing and add a binding for the IP address you wrote down earlier and the port that the site is running on. You can usually just copy the localhost binding and change localhost to the IP address or your machine name.
You will also need to run this command as an administrator to add an http access rule, where <ipaddress> should be replaced with the IP you wrote down or your machine name, and <port> should be replaced with the port on which IIS Express hosts your website.
netsh http add urlacl url=http://<ipaddress>:<port>/ user=everyone
At this point, you might be in luck. Try restarting IIS Express and navigating to your site from inside the HyperV VM. If it works, you are all set; if not, you will need to add a rule to the Windows Firewall (or whatever firewall software you have running).
Windows Firewall
The VM can see your machine and IIS Express is binding to the appropriate IP address and port, but the firewall is preventing traffic on that port. To fix this, we can add an inbound firewall rule. To do this, open up Windows Firewall from Control Panel and click Advanced Settings or search Windows for Windows Firewall with Advanced Security and launch that.
Select Inbound Rules on the left, then New Rule… on the right and set up a new rule to allow connections the port where your site is hosted by IIS Express. I have shown an example here in the following screen grabs, but use your own discretion and make sure not to give too much access to your machine.
Once you have set up a rule to allow access via the appropriate port, you should be able to see your IIS Express hosted site from inside your VM of choice.
As always, if you have any feedback, please leave a comment.
- You can also try using the name of your machine for the following steps instead of the IP [↩]
I think I missed a very important detail in this post about editing the ApplicationHost.config file. Instead of modifying the existing binding from localhost to your IP, you should include TWO bindings in the list: one for localhost, and the other for the IP.
Re-reading this article, I think you are suggesting the latter, though it is worth stressing this point. If you just change the existing binding, it will work for a while… but at some point, Visual Studio will get confused and create a new profile called "Website (n)" where n increments. It is like it detects the change and adapts to fix it. I've been fighting this issue for about a year now, constantly changing it back every time. But it seems just having two bindings is the key.
Sorry if that was the original intent of this article… I just think it is worth stressing the point because I'm me and I feel much happier today than I have in approximately 345 days of sadness and anger after having figured out the error in my ways.
I believe you are referring to this part (emphasis added):
"Find the website that you are testing and add a binding for the IP address you wrote down earlier and the port that the site is running on. You can usually just copy the localhost binding and change localhost to the IP address or your machine name."