[new:30/06/2011]Accéder à l’IP du client est parfois nécessaire, Silverlight étant une technologie côté client tournant dans une sandbox cette information ne lui est pas accessible. Dans un précédent billet je vous ai montré la façon classique, via un service Web, d’obtenir l’IP du client. Aujourd’hui je vous propose une astuce d’un style très différent.
La technique du Web Service
Dans le billet “Silverlight : accéder à l’IP du client“ je vous montrais comment créer un Web Service très simple qui permet de retourner à l’application Silverlight l’IP de l’utilisateur.
Cette technique fonctionne très bien même si le petit exemple en début de l’article ne tourne plus...
... Et il ne tourne plus parce que le serveur utilisé en face ne répond plus.
Il ne répond plus parce que je pointais le serveur d’un autre site qui offrait ce service et qui ne l’offre plus.
Il ne l’offre plus car, par force, cela devait générer pas mal de trafic au fur et à mesure que le service était connu...
Et on en arrive à ce qui est gênant avec cette technique : il faut un serveur, un service, et ce dernier consomme de la bande passante pour une information somme toute pas si essentielle et alors même qu’on pourrait la connaitre d’une autre façon ...
La technique de la page Aspx
Une application Silverlight peut être intégrée à une page Html, ce qui se pratique souvent, ou bien dans une page ASP.NET, ce que Visual Studio vous propose lorsqu’on intègre l’application SL dans un site Web.
Bien entendu, si la page qui héberge l’application est de type Html, il n’y a pas grand chose à faire... Mais en dehors de ASP.NET cette page peut aussi avoir été générée avec des langages comme PHP et dans ce cas le même type d’astuce que celle que je vais vous montrer peut s’appliquer.
Si la page est de type ASP.NET (ou technique similaire) il y a une approche très différente de celle du Web Service qui peut être utilisée.
En effet, une page ASPX n’est jamais qu’un “modèle” qui est balayé par ASP.NET, en conjonction avec de l’éventuel code-behind, pour générer, au final, un document HTML qui sera transmis au client. Tout cela implique que le client a fait un appel à votre serveur et que sur ce dernier une application a répondu.
Du coup, si on y réfléchi bien, un “service”, au sens large du terme, a déjà été activé avant que le plugin Silverlight n’ait activé votre application. Ce qui se comprend quand on prend conscience que la page HTML est d’abord retournée au butineur et que seulement ensuite celui-ci en interprète le contenu pour l’afficher (et gérer les balises comme <object> utilisées pour instancier des objets comme on le fait pour le plugin Silverlight).
N’y aurait-il pas moyen, au lieu de créer un Web Service qui sera appelé ensuite par l’application, d’utiliser ce premier appel à la page ASP.NET ?
Si, bien sûr.
Première étape : configurer le plugin
Comme vous le savez, le plugin Silverlight s’active par une balise Object qui contient des sous-balises <param> pour paramétrer l’appel à l’application (le fichier Xap), la taille de la région réservée dans la page, la couleur du fond, etc.
Parmi ces balises de paramétrage il y en a une qui n’apparait pas par défaut et qui autorise le passage de paramètres à l’application Silverlight elle-même.
Puisque le code HTML de la page est généré côté serveur par une sorte de service, la page ASPX et le Framework ASP.NET, on peut récupérer l’IP de l’appelant comme dans toute application serveur et en profiter pour générer un bout de HTML qui contiendra cette valeur, passée comme un paramètre dans la balise Object qui instancie l’application Silverlight...
Regardons de plus près cette astuce en étudiant le code d’une balise <object> :
<object data="data:application/x-Silverlight-2," type="application/x-silverlight-2"
width="100%" height="100%">
<param name="source" value="MonAppli.xap" />";
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="4.0.50826.0" />
<param name="autoUpgrade" value="true" />
<param name="initParams" value="userIp=<%Response.Write(Request.Params["REMOTE_ADDR"]);%>" />
<!-- code si le plugin SL n'est pas installé -->
</object>
Ce qui nous intéresse ici se trouve à la fin, la balise <param> pour le paramètre “initParams”. Sa “value” est constituée normalement d’une suite “paramètre=valeur” séparés par des virgules. On peut y placer ce qu’on veut du moment qu’on respecte cette syntaxe.
Ici, nous avons passé un paramètre “userIp” qui est égal à ... une incrustation C# ! Cela marcherait avec du VB de la même façon. Et cette incrustation utilise Request.Params[“REMOTE_ADDR”] pour récupérer l’adresse IP de l’appelant. Puis elle utilise Response.Write pour écrire cette valeur directement dans le flux HTML, donc après le signe égal du paramètre.
Au final le client reçoit un HTML bien formé contenant une balise Object qui instancie votre application SL à laquelle est passée la série de paramètres contenu dans “initParams”, donc la valeur en clair de l’IP de l’appelant.
Dans un second temps le browser va interpréter la page pour l’afficher, il tombera sur la balise Object et passera de façon toute naturelle les sous-balises <param> dont “initParams” qui contient l’IP destinée à l’application SL... Rusé, is’nt it ? !
Seconde étape : récupérer l’IP
Bon, la page ASPX a joué le rôle d’un Web Service pour récupérer l’IP du client, et l’inscrire “en dur” dans la page HTML retournée, comme si elle en faisait partie depuis toujours...
Reste à récupérer l’IP, c’est à dire le paramètre “userIp” destiné à l’application Silverlight et passé dans “initParams”.
C’est dans App.Xaml que les choses se passent :
private void Application_Startup(object sender, StartupEventArgs e)
{
var userIp = e.InitParams["userIp"];
this.RootVisual = new MainPage();
((MainPage) RootVisual).UserIp = userIp;
}
la variable userIp récupère le paramètre “userIp”, c’est aussi direct et simple que cela.
Ensuite le RootVisual est instancié, et nous lui passons enfin la fameuse adresse IP pour qu’il en fasse ce qu’il veut. Pour ce faire nous avons juste ajouté une propriété publique à la page Silverlight, une propriété de type string qui se nomme UserIp (ce qui est très original vous l’admettrez !).
Après, ce que l’application Silverlight fera de cette IP est une autre affaire, la question était “comment récupérer l’IP du client dans une application Silverlight”, pas “que faire de l’IP client”...
Conclusion
C’est une petite astuce, mais si l’application Silverlight a besoin uniquement de l’IP, il semble un peu lourd de créer un Web Service juste pour ça, et cette astuce permet de l’éviter.
Comme on le constate elle se met en œuvre de base avec trois uniques lignes de code, l’une dans le fichier ASPX, les deux autres côté Silverlight (la propriété et la récupération du paramètre).
C’est facile, cela évite l’écriture d’un service, son paramétrage et sa maintenance. Bref, cela rend moins lourd la récupération de l’information. A condition d’héberger l’application SL dans une page ASP.NET.
Bon tracking, et...
Stay Tuned !