Windows Store apps: StreamSocket connection to localhost
Posted on July 8, 2013
The problem: running unit tests on a Windows Store app that connects to a port on localhost results in the error “A connection attempted failed because the connection party did not properly respond after a period of time …”.
Connecting to a loopback address (127.0.0.1 or localhost) is not supported in a Windows Store application. Period.
However, connecting to localhost while debugging an application in Visual Studio IS supported. For example, suppose you have an app that connects to a web service to consume data, and to test it, you want to host the web service on your development machine. This does work. How to get it working is a little bit obscure.
To enable connections to localhost, you need to do two things:
- Add the Internet (Client) network capability to your package manifest Package.appxmanifest:
This should be a familiar step. This capability (and possibly Internet (Client & Server) ) is required for all Windows Store apps that use the internet, even outside of development. More details here.
- Enable the loopback exemption for the application. This is the obscure part. There is a list of apps that are allowed to use loopback (but only in development). There’s a special tool to manage this: CheckNetIsolation.exe. Open up the Developer Command Prompt for Visual Studio 2012 and enter
checknetisolation LoopbackExempt -s
This shows you the list of exempt apps. My list looks something like this:
List Loopback Exempted AppContainers [1] ----------------------------------------------------------- Name: 71019b7c-6915-4a32-a9e6-4b87a5b51d02_x1xh075qegwdj SID: S-1-15-2-3309481533-1492278452-4137804630-1388503216-2127054748-690736844-819066020 [2] ----------------------------------------------------------- Name: kexp90.3fmseattle.kexpartistdiscovery_svgdnat1p2vd6 SID: S-1-15-2-2012563013-332449103-1712730079-3179316490-2234986268-3338726070-3088550585 [3] ----------------------------------------------------------- Name: AppContainer NOT FOUND SID: S-1-15-2-3997858894-1722826965-2906774761-292339451-3072000487-3297839464-3180616200 [4] ----------------------------------------------------------- Name: AppContainer NOT FOUND SID: S-1-15-2-2670002398-4120870820-383953950-3982430728-1889674389-1530876232-793725804 OK.
To add your app to the list, use this command:
checknetisolation LoopbackExempt -a -n=package-name
where package-name is your application’s package name. You can find this on the Packaging tab of the app manifest editor:
You can read more about the checknetisolation tool here.
Now you should be able to use StreamSocket to connect to localhost – but only when debugging.
Got something to say?