Silverlight : appel de services RPC (WCF ou Soap) en synchrone

Je me suis bien marré ce matin, ça fait du bien.


J’étais en train de chercher un moyen de faire des appels en synchrone en Silverlight. Jusqu’à présent le pattern que nous connaissons tous est de s’enregistrer sur un event Completed puis de lancer l’appel, celui-ci se fait en asynchrone puis le retour de la méthode génère l’événement completed.


Malheureusement je suis face à un cas, où je dois être en synchrone obligatoirement ; je travaille sur un player elarning en Scorm basé sur Silverlight. Le scorm utilise des méthodes (initialize, setvalue, getvalue, etc.) qui permettent de faire une communication avec un cours via Javascript.


Mes méthodes sont déportées aussi sur un frontage de service WCF. Mon premier essai fut un desastre : lorsque mon cours (en Flash caca) appelle l’une de ces méthodes, il passe d’abord par le Javascript qui remonte ensuite vers le Silverlight qui appelle la méthode sur le service WCF.


Oui mais la méthode renvoie tout de suite : elle est en asynchrone ! Donc la fonction JS aussi, donc le cours plante lamentablement…


J’ai donc cherché un moyen de faire des appels Synchrones. Premiere étape de tout bon développeur : Bing ! Je tombe alors sur un article d’un mec nommé Daniel Vaughan vraiments très très bon sur codeproject. En fait un peu comme les miens :p … sauf que lui quand il parle anglais ca inspire le respect, … fin bref.


Article interessant mais qui est à mes yeux faux : Il prétend avoir trouvé un moyen de faire du synchrone en Silverlight, je vous laisse juger par vous même :


http://www.codeproject.com/KB/silverlight/SynchronousSilverlight.aspx


Bien écrit, propre, clair, mais son asynchrone est en fait un appel synchronizé maladroitement sur un thread asynchrone … bof. L’étiquette ne correspond pas au produit.


Sur bing on ne trouve rien d’autre, sur google aussi d’ailleur… J’ai donc cherché un autre moyen.


Comme je suis un fan des Rias, je suis revenu aux sources : XmlHttpRequest et là j’ai eu l’idée !


Je fais un appel de mon service WCF via Javascript à l’aide d’une requête XmlHttpRequest. La fonction Javascript qui contient cet appel est générique et peut cibler des endpoints de services différents et des méthodes différentes. Le tout quelque soit le nombre de paramètres (en gros : no limit). La fonction javascript se présente comme ceci :


 


function SyncWCFServiceCaller()
{
var client = null;
if (window.XMLHttpRequest)
client = new XMLHttpRequest();
else if (window.ActiveXObject)
client = new ActiveXObject(“Microsoft.XMLHTTP”);
var data = arguments[1];
client.open(‘POST’, arguments[0], false);
client.setRequestHeader(‘Content-Type’, ‘application/json; charset=utf-8′);
client.setRequestHeader(‘Content-Length’, data.length + ”);
client.send(data);
var response = eval(‘(‘ + client.responseText + ‘)’).d;
return response;
}



 


Je l’ai placée dans la testpage html auto générée de Silverlight. J’utilise le mot clé arguments pour acceder à l’array des paramètres passés à la méthode. Je créé un objet XmlHttp, j’indique l’url du service suivit du nom de la méthode (http://localhost/service.svc/dowork). Dans le second paramètre se trouve une serialisation Json des paramètres à passer à la méthode (du type {“name” : “valentin”}).


Coté C# j’ai créé un petit manager qui me permet d’appeller cette méthode en lui donnant l’url du service et les paramètres serialisés :


 


public class ContractToJavascriptCaller<T>
{
public string ServiceEndPointUri
{
get;
private set;
}



public ContractToJavascriptCaller(string serviceEndPointUri)
{
   this.ServiceEndPointUri = serviceEndPointUri;
}

public object CallMethod(string methodName, params string[] arguments)
{
  StringBuilder builder = new StringBuilder();
  builder.Append(“{“);

  MethodInfo methodInfo = typeof(T).GetMethod(methodName);
  ParameterInfo[] parameters = methodInfo.GetParameters();

  int parameterIndex = 0;
  foreach (ParameterInfo parameter in parameters)
  {
    builder.Append(“\””);
    builder.Append(parameter.Name);
    builder.Append(“\””);
    builder.Append(“:\””);
    builder.Append(arguments[parameterIndex++]);
    builder.Append(“\”,”);
  }
 string jsonSerializedParameters = builder.ToString().TrimEnd(‘,’);
 jsonSerializedParameters = string.Concat(jsonSerializedParameters, “}”);
 
  return HtmlPage.Window.Invoke(“SyncWCFServiceCaller”, string.Concat(this.ServiceEndPointUri, “/”, methodName), jsonSerializedParameters);
  }
}


 


C’est la méthode CallMethod qui fait tout le travail. Mon serialiser JSon à l’intérieur est bidon et constitue l’axe d’amélioération de mon code : il ne travail que sur les paramètres de type string : bof. J’appelle la fonction Javascript en lui donnant le nom de la méthode et l’uri du service concatènés et les paramètres sérialisés en JSon. La serialisation Json se base sur l’étude du type spécifique de la classe ContractToJavascriptCaller (nommé T). Il etudie la méthode à appeller et en tire les paramètres à l’aide de la reflexion.


L’appel à une méthode en Synchrone est alors exessivement simple :


ContractToJavascriptCaller<IService> caller = new ContractToJavascriptCaller<IService>(http://localhost:23770/Service.svc);
this.ResultTextBlock.Text = = caller.CallMethod(“DoWork”, this.firstMathodTextBlock.Text).ToString();


Pourquoi s’ennuyer avec des techniques fastidieuses quand tout est simple ? :)


[soon]


Valentin

XNA Tutorial 1 for Windows Phone 7 Series Installation et Configuration de l’environnement

Première cours/tutoriel sur l’installation du Xna Game Studio 4.0 en CTP et la configuration de son système d’exploitation pour le développement de jeux sur le Windows Phone 7 Series.


Le but de cet article est le téléchargement de tous les outils utiles et le lancement d’un premier projet basique s’exécutant sur ce device.


Outils à télécharger et installer


Trois installations seront nécessaires dans l’ordre qui suit :


  1. Visual Studio 2010 Express for Windows Phone CTP
  2. Le DirectX Software Development Kit
  3. Les derniers runtimes DirectX
  4. Le XNA Game Studio 4.0 CTP


 A noter que les points 2 et 3 portant sur les téléchargements liés à Direct X sont facultatifs. Ils permettant de s’assurer que son environement dispose bien des derniers runtimes et apportent un ensemble de tutoriaux, samples, assets utiles pour tout développeur. Enfn, le point 4 installe Visual Studio 2010 Express for Windows Phone CTP et le Xna Game Studio 4.0 CTP. La conclusion ? si vous êtes fainéant passez directement à l’étape 4.


D’après la release note, Xna Game Studio 4.0 ne supporte pas la présence d’une autre version de 2010 sur votre machine. Si tel est votre cas et que vous ne pouvez pas vous passer de la RC ou de la CTP antérieures utilisez la Virtual Box de Sun (bien connue des Consultats Microsoft qui n’utilisent que ça) pour vous créer une machine virtuelle sur laquelle travailler : http://www.virtualbox.org/.


Première étape, l’installation de Visual Studio 2010. Téléchargez cet IDE à cette adresse : http://www.microsoft.com/express/Downloads/#2010-Visual-CS.


Visual Studio est en version Express ici. Il ne dispose pas de tous les outils que l’on peut trouver dans une version professionnal ou supérieure. Mais pour travailler sur le XGS elle est largement suffisante et bon nombre de développeur la préfere dans la mesure où est est plus légère et rapide. Le tout avec des solutions toujours compatibles avec les versions supérieures. Vous devriez obtenir un ISO facilement exploitable avec des outils comme Daemon tools. L’installation typique de Visual studio est relativement rapide et simple. La fin de l’installation demande un redemarrer de votre machine. Avant de continuer les installations suivantes, pensez à lancer l’IDE une première fois par principe.


La seconde étape porte sur le SDK DirectX et les runtimes, accessibles respectivements ici : http://msdn.microsoft.com/directx/default.aspx et ici  http://www.microsoft.com/downloads/details.aspx?familyid=2da43d38-db71-4c1b-bc6a-9b6652cd92a3&displaylang=en. Installation classique là aussi. Il est important de parcourir les contenus du SDK DirectX qui sont particulierement interessants. Ils ne sont certes pas basé sur le Xna Framework mais contiennent un grand nombre d’exemples et de documentation sur DirectX (sur lequel repose le framework Xna).


Viens enfin le principal, le XGS 4.0 CTP. Un seul lien : http://go.microsoft.com/fwlink/?LinkID=185968. Installation là encore simple.



Après installation, visual studio est prêt à travailler :


 


Un premier jeu basique


 Ce ne sera pas un jeu au premlier sens du terme, puisque nous allons juste lancer sur un émulateur le projet créé par visual studio sans rien modifier.


Ouvriez la fenêtre de création de projet (File -> New Project ou Ctrl+ Shift + N).  Selectionnez Xna Game Studio 4.0. Appraissent alors les différents projets basés sur le Xna. On remarque la présence de projets Xbox 360 alors que l’équipe Xna avait annoncé que la CTP ne permettrait le développement que sous Windows Phone.



Selectionnez Windows Phone Game et validez.


On se retrouve alors avec un projet relativement proche de ce qu’on pouvait avoir avec la 3.1. Une classe Game pré remplie qui affiche un écran bleu et etudie le GamePad (avec correspondance sur les touches du Windows Phone) pour quitter l’application. Le projet Content (nommé WindowsPhoneGame1Content) n’est plus un sous projet du projet Xna  mais un projet à part entière référencé. Le contenu de la classe Game et des projets sera explicité dans le prochain article.



 Lancez le programme avec la touche F5. Après quelques seconde l’émulateur Windows Phone apparait à l’écran en chargeant l’application qui vient d’être compilée.


Après quelques secondes, l’écran bleu apparait enfin.



Documentation


Deux liens importants avant de terminer cet article, la documentation Msdn sur le Xna Game Studio :


http://msdn.microsoft.com/library/ff402529(VS.92).aspx pour le Xna Game Studio 4.0.


http://msdn.microsoft.com/library/bb200104(XNAGameStudio.31).aspx pour le Xna Game Studio 3.1.


 


[Soon]


 


Valentin


 

GDC : autres retours

D’autres retours issus de la GDC :


  • Xna 4.0 sera intégré à 2010. Donc on aura enfin le content pipeline et le device selector sous 2010.
  • Ajout de fonctionnalités au BasicEffect
  • Nouveaux effets : le SkinnedEffect, EnvironmentMapEffect, DualTextureEffect, AlphaTestEffect
  • Gestion du Microphone
  • A priori des incompatibilités à prévoir entre le framework 4.0 et le 3.0 : amélioration de la brique Gaphics, modification des Caps avec la notion de profiles, découpage de la dll Microsoft.Xna.Framework.dll en plusieurs assemblies (afin d’améliorer la portabilité du code)
  • Non support de la famille Zune (Microsoft veut le maximum de développeurs sur WP7 et encourage à passer sur cette nouvelle plate-forme).
  • Toujours pas d’infos précises sur la partie Xbox Live et WP7.

Sessions développement de jeux aux Tech Days 2010

Elles sont enfin en ligne.


 


Silverlight Game


http://www.microsoft.com/france/vision/mstechdays10/Webcast.aspx?EID=b4074586-f818-4a35-924f-be6d1aa21c89


Zune HD


http://www.microsoft.com/france/vision/mstechdays10/Webcast.aspx?EID=9176faf8-bed0-4c89-9ed6-728e9a9f689b


Xna Prez


http://www.microsoft.com/france/vision/mstechdays10/Webcast.aspx?EID=0340faaf-4dfc-4963-9a8b-eda4374f710d


 


Merci à Antoine Emond et Julien Frelat qui ont été à mes cotés durant ces sessions que j’ai adoré présenter.


 


Valentin

Xna Game Studio 4.0 annoncé aujourd’hui à la GDC


Aujourd’hui à la GDC devrait être annoncé l’arrivée du Xna Game Studio 4.0 sous un ou deux mois.


Le XGS 4.0 permettra le développement de jeux et d’applications multimédias sur les machines tournant avec Windows Phone 7 series.
Une partie des fonctionnalités Xbox Live sera disponible permettant leur utilisation sur un téléphone.
Le Framework Xna en 4.0 restera portable avec les 3 autres plateformes (Windows/Surface, Xbox 360)


Les deux familles de développeurs distincts sur le Xna Game studio n’auront pas accès aux mêmes possibilités sur le Live Market Place :
Les développeurs “managés” (“managed developpers”) pourront intégrer des fonctionnalités Xbox Live dans leurs applications. Leurs jeux seront vendu sur le Windows Phone Market Place et sur une plateforme déchange de jeux.
Les développeurs non managés (“Non-managed developers”) auront accès aux mêmes outils de développement que les premiers mais sans accès aux fonctionnalités Xbox Live. Leurs jeux seront vendu sur le Windows Phone Marketplace.


Les fonctionnalités disponibles Xbox Live pour un jeu Xna présent sur un Windows Phone 7 Series seront


  • Accès aux Gamerscore et aux succès notables.
  • Accès aux Xbox LIVE Leaderboards
  • Accès à l’avatar Xbox LIVE
  • Accès aux feeds “Spotlight” (mouais …)
  • Gestions des amis (pas trop d’infos sur ce qu’il sera possible de faire ici mais Friends + Xbox Live == FCB ? :) )
  • Gestion asynchrone du jeu en réseau

[Updated, merci à Jeremy]


 [Soon]


 


Valentin