Lorsqu'on développe pour Windows Phone 8 il arrive assez rapidement qu'on est besoin de mettre des données sur le Cloud, dans notre cas Azure. Les outils pour développer avec Windows Azure et Windows Phone 8 sont très complet mais loin d'être intégré. Prenons un exemple nous faisons un WCF Azure qui sera appeler avec Windows Phone :
On créé une application Windows Phone 8 et on ajoute un projet Azure Rôle WCF
Notre projet est créé. Si on lance le projet WCF l'adresse est sur localhost :
Cette adresse est fixe et si on essai avec l'adresse IP réelle de la machine on a une erreur :
Si on lance le projet Azure l'adresse est sur 127.0.0.1 :
Idem si on passe sur notre IP réelle
On se rend compte maintenant du problème, seul les adresses locales sont disponibles, ainsi on ne peut utiliser que les adresses en 127.0.0.1 en utilisant l'émulateur Azure et localhost en utilisant IISExpress pour tester notre service. Hors si on fait une référence à 127.0.0.1 ou à localhost le service ne pourra être appelé par l'application Windows Phone car le service n'est pas en local. Le problème est donc la communication entre l'émulateur WP8 et le serveur IISExpress ou l'émulateur Azure.
Commençons d'abord par IISExpress.
Dans « Mes documents » on a un répertoire IISExpress on va dans le répertoire config et on ouvre le fichier applicationhost.config. et on recherche l'élément <Site> qui correspond à notre site IISExpress
<site name="AzureService" id="8">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\users\xavier\documents\visual studio 2012\Projects\TestConnectAzure\AzureService" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:1593:localhost" />
</bindings>
</site>
On copie l'element Binding et on ajoute notre ip
<site name="AzureService" id="8">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="c:\users\xavier\documents\visual studio 2012\Projects\TestConnectAzure\AzureService" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:1593:localhost" />
<binding protocol="http" bindingInformation="*:1593:192.168.11.37" />
</bindings>
</site>
On redémarre IISExpress et on teste:
Maintenant avec IISExpress on a notre adresse IP de machine qui fonctionne et on peut y faire référence dans l'émulateur WP8.
Le problème et qu'on n'utilise pas l'émulateur Azure, et si on utilise des API propre a azure on aura des erreurs dans le Web Services.
Pour l'emulateur Azure on doit modifier le fichier C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\devfabric\IISConfigurator.exe.config. dans le fichier on ajoute la ligne
<add key="FixedSiteBindingIpAddress" value="192.168.11.37"/>
Le fichier ressemble donc a :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
</startup>
<!-- these settings are for the devfabric scenario -->
<appSettings>
<add key="SetupCloudDriveDevPath" value="true"/>
<add key="SetupMachineKeys" value="false"/>
<add key="FixedSiteBindingIpAddress" value="192.168.11.37"/>
</appSettings>
</configuration>
On n'oublie pas de redémarrer le process IISConfigurator et IISExpress.
On lance l'emulator Azure :
Maintenant on utilise des adresses IP réelle et on peut donc faire une référence à ces adresse dans notre application WP8 et débuguer.