Vous êtes sur la page 1sur 52

Option Transversale Microsoft, Technologies .

NET

Livre blanc
Dveloppement dune application client laide de Silverlight et WCF : twittomator v1.0 b
BENBOUZID Saad et SOUIBA Hicham

2010

1
Sommaire
Prsentation ......................................................................................................................................... 3 Contexte ........................................................................................................................................... 3 Problmatique ................................................................................................................................ 3 Objectifs ............................................................................................................................................ 4 Le projet ............................................................................................................................................ 4 Concepts .............................................................................................................................................. 4 Vue globale ................................................................................................................................. 4 Architecture serveur twitter.com ........................................................................................... 6 Architecture middleware......................................................................................................... 7 Architecture cliente ................................................................................................................... 7 Pr-requis et outils .......................................................................................................................... 8 Services ......................................................................................................................................... 8 Client .............................................................................................................................................. 8 Services ................................................................................................................................................. 8 Initialisation de la solution ............................................................................................................ 8 Projet Twitterizer2 .......................................................................................................................... 10 Librairies de classes ...................................................................................................................... 12 Projet WSConnection.Web ........................................................................................................ 14 Services ....................................................................................................................................... 14 Configuration du serveur web.............................................................................................. 19 Tests .................................................................................................................................................. 28 Tests fonctionnels...................................................................................................................... 28 Tests pour client Silverlight ...................................................................................................... 31 Client.................................................................................................................................................... 35 Fonctionnalits .......................................................................................................................... 35 Initialisation de la solution ...................................................................................................... 36 Blacklight, Silverlight Toolkit et ressources externes ........................................................ 37 Enregistrement dinformation ct client : Isolated Storage ...................................... 39 Intgration des services Web ............................................................................................... 41 Mcanisme de Callback (twitter) ....................................................................................... 42 MOOB (Mode Out of browser) ............................................................................................. 43

2
Dploiement et hbergement..................................................................................................... 45 Configuration IIS ........................................................................................................................... 45 Installation de WCF .................................................................................................................. 46 Installation de .NET4 ................................................................................................................. 46 Dploiement du projet WSConnection.Web ................................................................... 46 Dploiement du client Twittomator .................................................................................... 49 Accs et scurit ..................................................................................................................... 49 Evolutions ............................................................................................................................................ 50 Gnricit ...................................................................................................................................... 50 Dploiement .................................................................................................................................. 51 Remerciements ................................................................................................................................. 51

3
Prsentation Contexte
Twitter est lun des nombreux rseaux sociaux que lon peut trouver sur la toile, ceci prs quon le reconnat plus pour le microbloging (publication et partage de trs courts articles, la plupart faisant rfrence une page web dans laquelle se trouve de plus amples informations). Comme tout rseau social, il possde une communaut dutilisateurs (environ 12 millions aujourdhui), dont linteraction entre ces derniers et le rseau Twitter se fait principalement depuis le portail Web propos par le groupe : twitter.com. Cependant, limage dautres rseaux sociaux populaires (par exemple facebook), Twitter propose ses utilisateurs de pouvoir utiliser les fonctionnalits proposes par le portail web, et plus encore, grce une architecture oriente services pour le Web (REST : Representational State Transfer).

Problmatique
La plateforme Twitter propose aux dveloppeurs amateurs et professionnels , et a fortiori des applications tierces et indpendantes de la socit Twitter de pouvoir utiliser ses fonctionnalits sans avoir naviguer sur son portail Web. Ceci prsente lavantage de laisser le soin des applications clientes de se dtacher des guides de styles et de navigation proposes par le portail web de Twitter. Nanmoins, Twitter demeure le fournisseur et interlocuteur exclusif avec lequel les applications clientes devront communiquer. Par consquent, lhte excutant une application cliente cest--dire consommatrice des services proposes par devra disposer au minimum dune connexion Internet et de lautorisation daccs au domaine twitter.com. Les services proposs par Twitter sont des services web dits REST (on parle alors de en tant que systme RESTful), qui se basent sur lchange de donnes aux formats XML, objets JAVA srialiss ou JSON, via protocole HTTP. Cependant, il existe dautres types de services web normaliss, se distinguant de larchitecture REST, qui sont standardiss par des protocoles de communication et dchanges diffrents. Cest le cas du protocole SOAP (Simple Object Access Protocol), ou plus largement WSDL pour la description des services, dont les changes se font par fichiers XML sur protocole HTTP. Ce protocole est principalement utilis par les outils Microsoft et larchitecture de services web .NET. De plus, il sera plus vident dutiliser ce format dchange dans le cas dapplications clientes dveloppes en .NET. Cette solution vient au problme qui a t de rendre compatible lutilisation des nombreuses API pour Twitter crites en .NET que lon peut trouver en versions libres sur la toile (twitterizer, linq2twitter, ...), mais incompatibles avec Silverlight. Aprs avoir envisag la solution de rcrire et modifier le code source de ces API afin de rendre possible leur excution dans une application Silverlight, il est apparu que ctait impossible du fait du trop haut niveau du framework Silverlight (SL), qui saffranchit et interdit les procdures et appels curs de ces API, qui se situent au niveau des couches rseaux. Lide a alors t dutiliser une application

4
.NET intermdiaire, qui elle permet lutilisation de ces API, afin dchanger avec lapplication SL. Cependant, la manire la plus adapte pour lchange de donnes et lappel de fonctions distantes demeure les services web. En consquence de quoi lintermdiaire choisi est une application web service WCF, utilisant .NET 4 (pour des raisons de compatibilits optimales avec lapplication web Silverlight 4 cliente utilisant .NET 4 galement).

Objectifs
Dans la mesure o nous dvelopperons un client utilisant la technologie Microsoft Silverlight 4, sur framework .NET 4, nous utiliserons un fournisseur de services compatible et adapt Silverlight 4, savoir WCF (Windows Communication Foundation) .NET 4. Le fournisseur de services WCF sera charg de proposer des clients .NET (Web : Silverlight, ASP, etc. ou clients lourds : applications fentres (WinForms, WPF, etc.), applications consoles, etc.) les services quoffre larchitecture REST de. Pour cela, le cur de son dveloppement sera bas sur la conversion et la personnalisation de services REST vers SOAP. Il jouera le rle dintergiciel (Middleware) secondaire entre le domaine twitter.com et lapplication cliente. Notons cependant quune librairie implmentant les appels REST de sera utilise, sous forme dAPI (Application Programming Interface) pour .NET. Cette librairie jouera le rle dintergiciel primaire. Le client .NET que nous dvelopperons utilisera les fonctionnalits de en communicant grce lintergiciel secondaire (WCF .NET 4) et aura lavantage de prsenter quelques fonctionnalits du nouveau framework Silverlight 4.

Le projet
Dans le cadre du projet de lOption Transversale Technologies Microsoft nous avons opt pour la cration dun client Silverlight, reprenant tous les points qui viennent dtre cits cidessus. Lide de base tait non pas de crer un autre client (comme il en existe tellement !) mais un client pour la twittoma (twittosphre marocaine) qui viendrait sincruster dans un projet moyen terme que lon compte lancer. La maintenabilit ainsi que la flexibilit de loutil savrent donc primordiales. Deux personnes ont travaill conjointement pour mettre en place cette premire version bta de twittomator : Saad BENBOUZID Hicham SOUIBA

Concepts
Vue globale Larchitecture complte repose sur une architecture client-serveur dans interviennent des intergiciels. Dans le cadre du projet, ces entits sont les suivantes : laquelle

5
Serveur : twitter.com Fournit un ensemble dAPI dites RESTful, qui correspond lensemble des fonctionnalits coeurs de twitter (publication dun statut, lecture de statuts, gestion des suivis, etc.). Communique en lecture-criture sur le protocole http, avec changes de fichiers au format JSON. Lensemble du domaine, les bases de donnes et le code source des API sont privs. Intergiciel primaire : twitterizer2 Librairie .NET dobjets et de mthodes pour utiliser et communiquer avec les API RESTful de twitter (protocole HTTP et format des fichiers dchange JSON). Librairie incompatible avec Silverlight (3 et 4). Librairie compatible .NET 2.0+.

Intergiciel secondaire : WCF


Application web WCF .NET 4, incluant et utilisant la librairie twitterizer2. Hberge sur serveur web IIS7. Services publis sur annuaire public. Services utilisables uniquement par lhte client (celui qui hberge lapplication Silverlight cliente) : restriction de domaine pour les requtes SOAP.

Librairie de classes pour lchange des objets (espace de noms commun) Contient une librairie de classes pour Silverlight (Silverlight Class Library) pour lchange et lutilisation des objets communs avec lapplication web WCF. Contient une librairie de classes pour Silverlight (Silverlight Class Library) pour lchange et lutilisation des objets communs avec lapplication SIlverlight cliente.

Application cliente Silverlight 4 Projet Web dvelopp laide du framework Silverlight 4. Hberge sur serveur web IIS7.

6
Larchitecture gnrale peut se rsumer sur le schma suivant :

Architecture serveur twitter.com Les API RESTful de changent avec lAPI .NET twitterizer2 des fichiers au format JSON sur protocole HTML. Les API proposes par sont nombreuses et exhaustives par rapport aux fonctionnalits offertes par le rseau social. Les diffrentes fonctionnalits sont dcoupes en mthodes, recenses au sein de groupes de mthodes. A titre dexemple, le groupe account recensera les mthodes associes la gestion dun profil utilisateur (update_profile, update_profile_image, etc.). De plus, on distingue en amont des familles de groupes de fonctions, qui sont au nombre de deux : api (qui contient les groupes curs : users, statuses, account, friendship, ) et search (qui contient les groupes pour les mthodes de recherches et de statistiques). Le wiki de, accessible ladresse http://apiwiki.twitter.com/Twitter-API-Documentation, permet davoir une vue dtaille sur la spcification de chaque fonction, agrmente dexemples. Typiquement, lappel dune mthode se fait depuis ladresse http :
http://[famille_de _groupes].twitter.com/1/[groupe_de_fonctions]/[fonction].json?[paramtres]

ou bien
http://[famille_de_groupes].twitter.com/1/[groupe_de_fonctions]/[fonction]/[paramtre_de_fonction].jso n?[paramtres]

7
Architecture middleware Larchitecture middleware (intergicielle) a pour but de fournir au client Silverlight des services Web utilisant WCF, afin de faciliter les changes entre twitter.com et le client, et donc a fortiori dallger considrablement le dveloppement des fonctionnalits curs du client. Elle est dcoupe en deux intergiciels distincts : Un intergiciel charg dchanger des mthodes de lAPI twitter.com dans le format propos par celui-ci, savoir selon le principe RESTful. En rsum, cest une interface .NET pour Twitter. Il sagit dun projet .NET (2.0+) open-source sous licence BSD1, dont le dveloppement est toujours en cours (dernire version : Twitterizer2.0, 03/04/2010 site officiel du projet : http://code.google.com/p/twitterizer). Un intergiciel WCF charg de communiquer avec twitter.com en utilisant lintergiciel prcdent. Il proposera une version quasi semblable des mthodes proposes par twitterizer2, ceci prs quelles seront adaptes afin dutiliser des objets quun projet Silverlight peut galement utiliser (ce qui nest pas le cas pour twitterizer2), et quelles seront publies sous forme de services Web. Ce sera finalement cet intergiciel qui sera utilis par le client Silverlight, ou tout autre client dvelopp en langage .NET.

Les lments caractristiques et distincts entre ces deux intergiciels seront explicits dans un autre chapitre de ce document.

Architecture cliente
Larchitecture client se rsume en linterface Utilisateur qui va permettre ce dernier de pouvoir se loguer et effectuer des oprations sur son compte Twitter (envoyer des twitts, accder sa time line ainsi qu celle de ses amis ).

Dans la mesure o nous disposerons ces informations via des composants avancs de Silverlight et que lon va acqurir les donnes via WCF, un niveau moyen est requis : connatre les diffrents types de conteneurs, la programmation vnementielle et la manipulation de services web WCF. Les tutoriaux disponibles sur le site officiel de Silverlight http://www.silverlight.net/learn/tutorials/ permettront aux dbutants dacqurir les comptences requises.

http://www.opensource.org/licenses/bsd-license.php

8
Prrequis et outils
Services Le dveloppement de lapplication WCF se fait partir de lenvironnement Visual Studio 2010 2. Il faudra galement disposer de Microsoft .NET Framework 4 3 . Par ailleurs, dans la mesure o le client (proxy) consommateur des services Web ne sexcute pas forcment sur le mme hte que celui qui hberge les services, il est trs conseill de ne pas utiliser le serveur web de Visual Studio (UtilDev Cassini Web Server 4 ) mais Microsoft IIS 5 (Internet Information Service). Le dveloppeur devra satisfaire dune exprience en dveloppement orient objet en langage C#, ainsi que dune exprience dans le dveloppement, la maintenance et la publication de services Web WCF sur serveur IIS. Pour des informations sur lutilisation de ces technologies, veuillez-vous rfrer au chapitre Remerciements en fin de document. Client

En termes doutils utiliss ct client, il est ncessaire de disposer de la dernire version en date de Visual Studio 2010 (en version RC l'heure o ces lignes sont crites), du SDK Silverlight 4, du runtime client, et de manire facultative, Expression Blend 4 (en version bta lheure actuelle, on peut toujours envisager de crer linterface graphique laide de Microsoft Silverlight Tools intgr VS 2010 et le SDK Silverlight).

Microsoft a mis au point une plateforme tout en un qui permet de tlcharger tous les outils prcdemment cits via un installeur commun : Microsoft Web plateforme, disponible ladresse suivante http://www.silverlight.net/getstarted/. Cette plateforme ne concerne pour linstant que la version 3 de Silverlight, il faut mieux pour linstant privilgier une installation manuelle comme cest expliqu sur cette page : http://www.silverlight.net/getstarted/silverlight-4/.

Services
Ce chapitre va dcrire succinctement la marche suivre afin de disposer dun serveur de services Web pour utiliser les API de twitter.com, ce du dveloppement la publication, en passant par les tests.

Initialisation de la solution
Le projet consiste en une solution disposant de plusieurs projets :

2
3

http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx http://www.microsoft.com/downloads/details.aspx?FamilyID=a9ef9a95-58d2-4e51-a4b7-bea3cc6962cb&displaylang=en 4 http://p-gaudin.developpez.com/tutos/cassini 5 http://www.iis.net

9
1) Un projet WCF Service Application (Visual C# - .NET 4). Dans limplmentation que nous dcrivons, il sera nomm WSConnection.Web. Notons galement quun projet ASP.NET Web Application de Visual Studio fait galement laffaire ; limportant tant quil puisse contenir des lments Silverlight-enabled WCF Service.

Ce projet contiendra : les services et leur implmentation, la configuration du serveur Web (fichier Web.config) la rfrence vers les sources de twitterizer2 (en mode debug) ou vers la version compile (dll) de twitterizer2 (en mode release).

2) Un projet Class Library (Visual C# - .NET 4). Il sera nomm WSConnection.Entities.Web.

Ce projet contiendra : les classes utilises par les services, qui correspondent aux objets mtiers de Twitter (classes User, Status, DirectMessage, etc.). A noter quil ne sagit pas des mmes classes que celles utilises et dclares par twitterizer2.

3) Un projet Silverlight Class Library WSConnection.Entities.Silverlight.

(Visual

C#

.NET

4).

Il

sera

nomm

10
Ce projet contiendra : Les mmes classes que celles utilises dans le projet WSConnection.Entities.Web, par rfrence symbolique (liens vers fichiers) afin de conserver un contenu rigoureusement identique.

4) Un projet Silverlight Application (Visual C# - .NET 4) pour les tests uniquement. Il sera nomm Test.

Ce projet contiendra : Lapplication Silverlight (la page web unique, au format xaml, gnr par dfaut la cration du projet sera suffisante). Notons que le fichier aspx (ou html) charg de lancer le projet dans un navigateur web est stock dans le projet web de la solution, savoir WSConnection.Web (inutile de crer un second projet web).

La solution, que nous avons nomm WSConnection, se compose alors des projets suivants :

Important : veillez ce que vos projets soient configurs pour utiliser .NET 4. Dans le cas contraire, modifiez le paramtre depuis la fentre de proprits du projet concern puis recompilez afin de pallier aux ventuels conflits entre rfrences croiss de projets utilisant des versions diffrentes de .NET.

Projet Twitterizer2
Twitterizer2 est disponible en tlchargement sous la forme dune solution Visual Studio 2008, ayant un projet librairie de classes (Class Library) contenant les sources. Elle est accompagne de divers projets dmos (web, console, winform, ) afin de permettre lutilisateur de tester ses fonctionnalits sous diffrents cas dutilisation. Cependant, la librairie de classes nest utilisable que pour des projets .NET (que ce soit en rfrence sur le projet Class Library en question, ou sur la dll correspondant la version compile du projet Class Library). Ainsi, un projet Silverlight ne peut utiliser directement twitterizer2, ce qui nous oblige pallier ce problme en passant par un intermdiaire (le projet WCF WSConnection.Web).

11
Afin de faciliter le dbogage des services lors des dveloppements, nous utiliserons le projet Class Library Twitterizer2 dans notre solution, et nous y ferons rfrence depuis le projet WSConnection.Web. Dans le cas contraire, il nous aurait suffi de faire rfrence la dll twitterizer2.dll compile et incluse dans le rpertoire de gnration du projet twitterizer2.

Slectionnez ensuite le projet Twitterizer2 dans la solution tlcharge.

A prsent, il ne reste qu rfrencer le projet dans le projet WSConnection.Web.

12

A partir de maintenant, vous pourrez faire utiliser les mthodes et objets de Twitterizer2 depuis les fichiers sources du projet WSConnection.Web au moyen de linclusion using Twitterizer2;. Nous nallons pas dcrire le fonctionnement de cet API. Le lecteur trouvera une description approfondie sur le site6 de lditeur.

Librairies de classes
Il sagit de deux librairies WSConnection.Entities.Web et WSConnection.Entities.Silverlight, qui se basent sur les mmes classes, et mieux encore, sur les mmes fichiers. Cependant, chaque projet gnrera sa propre DLL. En effet, WSConnection.Entities.Web.dll devra tre utilis par le projet contenant les services, WSConnection.Web, et WSConnection.Entities.Silverlight.dll par le projet client Silverlight, en loccurrence le projet Tests pour les tests. Le lecteur remarquera que cette fois-ci nous faisons rfrence aux DLL (.dll) et non plus aux projets (.csproj), ceci pour deux raisons : 1) Les dll contiennent des classes qui nont pas de mthodes dbugger : les classes ne contiennent que des proprits et des constructeurs. 2) Les projets consommateurs des classes ne possdent pas forcment les sources des projets WSConnection.Entities.Web et WSConnection.Entities.Silverlight ou lauteur ne souhaite pas les distribuer afin de sassurer quelles ne soient pas modifies et que larchitecture entre projets utilisateurs et projets utiliss gardent sa cohrence. Afin dutiliser les librairies WSConnection.Entities.Web et WSConnection.Entities.Silverlight dans respectivement WSConnection.Web et Tests, il va falloir les rfrencer dans les projets. Mais avant cela, il faut veiller ce que les deux projets librairies utilisent le mme espace de noms. Renseignez le champ Default namespace pour les deux projets (WSConnection.Entities.Web et WSConnection.Entities.Silverlight), depuis la fentre de configuration du projet (clic droit sur la racine du projet > Proprits), avec comme nom WSConnection.Entities.

http://code.google.com/p/twitterizer/wiki/GettingStarted

13

Figure 1: Fentre de configuration du projet WSConnection.Entities.Web

Figure 2: Fentre de configuration du projet WSConnection.Entities.Silverlight

A prsent, il faut crer les classes mtiers partager entre les deux librairies. Nous nallons pas fournir le code de ces classes, car le lecteur pourra les retrouver dans le code source de la solution WSConnection qui lui est fourni avec ce document. Cependant, nous allons prsenter les correspondances entre les classes mtiers utilises par Twitterizer2 et celles utilises (mutuellement) par WSConnection.Entities.Web et WSConnection.Entities.Silverlight. La diffrence majeure rside dans le fait que les classes des deux dernires librairies ne contiennent pas de mthodes mais que des constructeurs, et le rapport rside dans le fait quils se partagent les mmes proprits, ce afin dobtenir et de stocker les mmes rsultats entre les services de WSConnection.Web et Twitterizer2. WSConnection.Entities DirectMessage DirectMessageCollection Status StatusCollection User UserCollection Tokens Twitterizer2 TwitterDirectMessage TwitterDirectMessageCollection TwitterStatus TwitterStatusCollection TwitterUser TwitterUserCollection OAuthTokens Description Message direct Collection de message(s) direct(s) Statut (ou twitt ), limit 140 caractres par Twitter Collection de statut(s) Utilisateur du rseau tweeter Collection dutilisateur(s) Ensemble de cls propre

14
un utilisateur authentifi, qui sont rappels dans chaque requte vers twitter.com. (voir OAuth pour plus de dtails sur cette mthode dauthentification7).
Figure 3 : Correspondance entre les objets de l'espace de nom WSConnection.Entities (changs entre les services et les clients), et les objets du projet Twitterizer2 (API .NET pour Twitter)

Projet WSConnection.Web
Ce projet constitue le seul projet Web de la solution. Il contiendra en plus des services web la configuration du serveur, et de ses services. Notons que le projet contient une page web par dfaut, ainsi quune page web pour le lancement du projet client Silverlight (de test) Tests. Services Nous allons prsenter lajout des services web au projet, sans entrer dans le dtail du dveloppement. Tout dabord, distinguons les lments de services des autres lments en crant un dossier dans le projet qui contiendra les lments services.

Nommez-le Services. Une problmatique se pose : le projet Twitterizer2 (espace de nom Twitterizer) charg de communiquer avec twitter.com manipule ses propres objets, qui ne sont pas les mmes que ceux des librairies de classes (espace de nom WSConnection.Entities), cf. tableau de correspondance prcdent. Cependant, les classes ont les mmes proprits, ce qui facilitera les conversions dobjets. En effet, il va falloir utiliser des mthodes pour convertir un objet dune classe de WSConnection.Entities en un objet dune classe de Twitterizer, et vis-versa (par exemple User

http://oauth.net

15
TwitterUser et TwitterUser User). Pour ce faire, nous allons utiliser une classe dutilitaires de conversions (static) qui permettra de convertir la vole et dans les deux sens un objet de Twitterizer en son objet de WSConnection.Entities correspondant. La classe se prsente avec les en-ttes de fonctions suivants :
public class ConversionUtilities { static public void CompleteConsumerKeys(Tokens tokens); static public Tokens CreateTokensFromOAuthTokens(OAuthTokens oat); static public OAuthTokens CreateOAuthTokensFromTokens(Tokens at); static public User CreateUserFromTwitterUser(TwitterUser tu); static public Status CreateStatusFromTwitterStatus(TwitterStatus ts); static public DirectMessage CreateDirectMessageFromDirectMessageCollection( TwitterDirectMessage tdm); static public StatusCollection CreateStatusCollectionFromTwitterStatusCollection( TwitterStatusCollection tsc); static public UserCollection CreateUserCollectionFromTwitterUserCollection( TwitterUserCollection tuc); static public DirectMessageCollection CreateDirectMessageCollectionFromTwitterDirectMessageCollection( TwitterDirectMessageCollection tdmc); }

Vous pouvez crer cette classe dans nimporte quel espace de nom du projet WSConnection.Web. Dans notre cas, nous lavons cr dans WSConnection.Web.Services (espace de nom qui contient galement les services). Avant de les crer, dtaillons les diffrents services que le projet WSConnection.Web va devoir produire. Rappelons que les diffrents services vont faire appel lAPI (le projet) Twitterizer2, et utiliser les objets des librairies de classes de lespace de nom WSConnection.Entities. La classe de conversion ConversionUtilities sera donc utilise dans chaque service, et chacune de leurs procdures.
Nom du service Authentication Fonctions principales Authentifications Demande dautorisation twitter.com (grant access) Demande du lien hypertexte dautorisation Envoi de statuts (twitts) privs des utilisateurs Gestion de sa bote de rception (twitts reus par dautres utilisateurs) : lecture et suppression Lecture de timelines (flux de twitts) : personnelle, publique damis (followers), etc. Gestion de twitts personnels : rdaction, publication, republication, suppression, etc. Gestion dun profil utilisateur. Gestion des "amis" : possibilit de suivre ou darrter de suivre un utilisateur. Recherche dutilisateurs par nom ou Classes WSConnection.Entities utilises - TokenResponse - UriLink

TwitterDirectMessageService

DirectMessage DirectMessageCollection

TwitterStatusService

Status StatusCollection

TwitterUserService

User UserCollection

16
identifiant Listes dutilisateurs : utilisateurs suivis, utilisateurs suiveurs Liste des twitts que vous avez publis et que dautres utilisateurs ont republi. StatusCollection

Figure 4 : Liste des services et descriptions succinctes

Note : TokenResponse contient un ensemble de cls renvoyes par twitter.com suite une authentification avec succs via le portail web twitter.com. Ces informations devront tre stockes et conserves par le client, une fois leurs avoir t rendues par le service invoqu. UriLink est une structure : public struct UriLink { public ReturnCodes returnedCode; public Uri returnLink; }; public enum ReturnCodes { OK, PROBLEM };

Elle correspond au lien renvoy par le service lors dune demande daccs (grant access) twitter.com de la part du client. A prsent, ajoutons les services. Pour cela, ajoutez dans le rpertoire Services du projet WSConnection.Web des lments Silverlight-enabled WCF Service que vous nommerez de la mme manire que ceux lists dans le tableau prcdent, en veillant conserver lextension (.svc) originale.

Les diffrences entre un service de type WCF Service et Silverlight-enabled WCF Service se situent aux niveaux suivants : Silverlight-enabled WCF Service - Un service NomDuService est par dfaut compos dune classe NomDuService.svc.cs (pas dinterface). Le service est ajout dans la configuration du serveur web (fichier Web.config la racine du projet), avec les paramtres adquats pour utiliser WCF et rend le service compatible pour ASP.NET et clients Silverlight. WCF Service - Un service NomDuService est compos par dfaut dune classe NomDuService.svc.cs et dune interface INomDuService.cs listant les mthodes que NomDuService.svc.cs implmentent. - Le service est ajout dans la configuration du serveur web (fichier Web.config la racine du projet), avec les paramtres pour utiliser la fois le fichier de classes (.svc.cs) et linterface (.cs). Cependant cette configuration ne rend pas le service compatible pour clients Silverlight.

Service

Compatibilit8

Figure 5 : Diffrence entre deux lments "service" de Visual Studio pour un projet Web

Il est conseill dutiliser une interface pour un ou plusieurs services donns, afin davoir une meilleure vue sur son dveloppement et permettre des implmentations gnriques de
8

Source :

http://www.dotnetcurry.com/ShowArticle.aspx?ID=228&AspxAutoDetectCookieSupport=1

17
services. Ainsi, il va nous falloir utiliser les avantages des deux types dlment service : le couple interface/classe et la configuration pour ASP.NET et Silverlight. Donc vous avez soit la possibilit de : Crer un service Silverlight-enabled WCF Service, et crer manuellement un fichier dinterface que vous prendrez soin de citer en tant que contrat dans la configuration du serveur pour ce service (fichier Web.config). Crer un service WCF Service et changer le mode de connexion dans la configuration du serveur pour ce service (fichier Web.config) : mode dattachement (binding) changer pour le point daccs (endpoint) pour ce service (passer de wsHttpBinding basicHttpBinding ou customBinding). Nous avons choisi de procder selon la premire alternative. Afin de publier une mthode dans un service, il faut prciser la directive [OperationContract]. A noter quune mthode statique (static) ne peut tre utilise. Cest dailleurs la raison mme qui nous empche dutiliser directement les mthodes de Twitterizer2, car la plupart dentre elles sont dclares statiques ; ce qui nous oblige implmenter des mthodes (de mmes noms) dappel. A titre dexemple, voici les diffrents lments, non exhaustifs, du service TwitterStatusService (les lments essentiels ont t saisis en gras).
----------------------------------- ITwitterStatusService.cs -----------------------------using WSConnection.Entities; namespace WSConnection.Web.Services { [ServiceContract] public interface ITwitterStatusService { [OperationContract(Name = "Delete")] Status Delete(Status twitterstatus); [OperationContract(Name = "DeletePrivate")] Status Delete(Tokens tokens, long id); [OperationContract(Name="GetHomeTimeLine")] StatusCollection GetHomeTimeline(); [OperationContract(Name = "GetHomeTimeLinePrivate")] StatusCollection GetHomeTimeline(Tokens tokens); //... } } -------------------------------------------------------------------------------------------

Notez que des noms personnaliss ont t donns aux mthodes dans leurs versions publies, car en effet le protocole SOAP est bas sur XML dont la syntaxe ne permet pas de grer les surcharges de mthodes (de noms identiques).
----------------------------------- TwitterStatusService.svc.cs --------------------------using WSConnection.Entities; namespace WSConnection.Web.Services { [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class TwitterStatusService : ITwitterStatusService

18
{ #region ITwitterStatusService Members public Status Delete(Status twitterstatus) { // } public Status Delete(Tokens tokens, long id) { // } public StatusCollection GetHomeTimeline() { // } public StatusCollection GetHomeTimeline(Tokens tokens) { // } } } -------------------------------------------------------------------------------------------

A titre dexemple, voici limplmentation dune des mthodes (Delete)


public Status Delete(Status twitterstatus) { TwitterStatus ts; try { ts = new TwitterStatus { Tokens = ConversionUtilities.CreateOAuthTokensFromTokens(twitterstatus.Tokens), Id = twitterstatus.Id } .Delete(); return ConversionUtilities.CreateStatusFromTwitterStatus(ts); } catch (Exception) { return null; } }

Explication : 1) Cration dun objet TwitterStatus de Twitterizer. 2) Utilisation de lobjet partir de paramtres de WSConnection.Entities pralablement converti pour Twitterizer. 3) Utilisation de lobjet de Twitterizer qui excute sa fonction avec lAPI de twitter.com (suppression dun statut (twitt) dans ce cas). 4) Rcupration de la valeur de retour de lobjet Twitterizer (dans notre cas, renvoie llment correspondant lobjet supprim en cas de succs (TwitterStatus), et lobjet null en cas dchec. 5) La valeur de retour est convertie en un objet Status de WSConnection.Entities et renvoy. Nous remarquons que le code des mthodes est dans la mesure du possible excut dans des espaces traitant les exceptions (try {} catch {}). Bien quune erreur non gre ou fatale ne fasse pas tomber le serveur, ou ncessite un redmarrage du service serveur web, si le code dappel des services ct client nest lui-mme pas contenu dans des espaces traitant

19
les exceptions, alors cela ferait plant le client. Dans le cas dun client web, cela se manifeste gnralement par larrt de lexcution des scripts sur la page avec affichage par le navigateur de la mention Erreur sur la page. Il faut alors ou relancer le navigateur si le client est dvelopp en utilisant des sessions et variables de sessions, ou tout simplement recharger la page. La spcification entre le client (Silverlight) et le serveur (WCF) veut que tout appel ayant subi un chec dans son excution renvoie lobjet null, et ce mme en cas derreur (gre par Twitterizer2) renvoye par twitter.com (par exemple : une erreur 401 en cas de demande de suppression dun objet Status qui ne peut pas ltre : un twitt qui ne vous appartient pas, par exemple celui dun ami). Partage dobjets Le lecteur expriment de WCF se rendra sans doute compte que la directive [DataContract] et [CollectionDataContract] permettant la srialisation9 dobjet na pas t utilise dans nos services. En effet, ce serait une des mthodes pour partager les classes de WSConnection.Entities, mais il prsente linconvnient de ntre utilisable que si lon ne possdait quun seul service. On voit par exemple que les services TwitterUserService et TwitterStatusService utilisent tous deux les classes Status et StatusCollection. Ceci a pour consquence pour le proxy (client Silverlight) de manipuler deux types dobjets diffrents pour Status et deux types diffrents pour StatusCollection, bien quil sagisse respectivement des mmes objets. Ainsi, un objet Status renvoy par lappel au service TwitterUserService ne pourra pas tre utilis en tant que paramtre pour le service TwitterStatusService. Une solution aurait t de faire en sorte que chaque service utilise des classes quaucun autre service nutilise, et donc en en tant une bonne partie, mais ceci aurait rduit considrablement la richesse de lAPI. Il existe une troisime manire de partager des objets : il sagit de larchitecture WCF Ria Services (depuis .NET 4 et Silverlight 4), avec notamment lutilisation dune librairie de classes WCF RIA Services Class Library et des lments services Domain Service Class. Pour de plus amples informations sur WCF Ria Services, vous pouvez vous rfrer ces quelques liens 10. Configuration du serveur web

Publication Nous avons la possibilit dutiliser le serveur Web interne Visual Studio 2010 (cassini), mais dans la mesure o la solution aura pour but dtre dploye sur un serveur web (IIS7), autant commencer tout de suite afin dviter de configurer une deuxime fois les mmes choses. Si ce nest pas dj fait, installez puis lancez le service IIS7.

10

using System.Runtime.Serialization. (Using DataContracts) http://msdn.microsoft.com/en-us/library/ms733127.aspx

(Creating a RIA Services Solution) http://msdn.microsoft.com/en-us/library/ee707376(v=VS.91).aspx (Learn About WCF RIA Services) http://www.silverlight.net/getstarted/riaservices/

20

Veillez configurer le pare-feu afin quil autorise les connexions entrantes HTTP si vous souhaitez rendre accessibles vos services depuis dautres htes. A priori, si vous testez vos services sur votre poste de dveloppement (projet Tests de la solution WSConnection par exemple), ce nest pas indispensable. A prsent, il faut publier le projet web (WSConnection.Web) sur IIS7. Pour cela, configurez le projet de la manire suivante :

Compilez la solution une premire fois afin de publier le projet Web en tant quapplication ASP.NET sur votre serveur IIS. Vous aurez peut-tre besoin de configurer votre serveur IIS7 afin quil puisse utiliser Microsoft Framework .NET 4 et WCF.

21
Pour installer le framework .NET 4, il faut que vous layez install sur votre poste. Si vous ne lavez pas, tlchargez-le depuis le site officiel de Microsoft. Excutez ensuite :
C:\windows\Microsoft.NET\Framework\v4.0.30128\aspnet_regiis.exe -i

Pour installer WCF dans IIS7, excutez la commande suivante :


C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation/ServiceModelReg.exe i

Aprs compilation avec succs, testez WCF sur votre serveur IIS7 en accdant lun des services. Par exemple Authentication.svc ladresse Authentication.svc

Figure 6 : page web l'adresse http://localhost/WSConnection/Services/

Figure 7 : page web l'adresse http://localhost/WSConnection/Services/Authentication.svc

Note : azed est le nom dhte du PC utilis pour le dveloppement par les auteurs du prsent document. Si le serveur IIS refuse de vous lister les fichiers ladresse http://localhost/WSConnection/Services/, il faut que vous activiez lexploration de rpertoire dans le gestionnaire IIS.

22

Double-cliquez ensuite sur la fonctionnalit Exploration de rpertoire et cliquez sur activez qui apparatra dans la barre dactions droite de la fentre. Autre mthode, veillez avoir la balise (en gras) dans votre fichier Web.config :
<!-- Avant --> <system.webServer> <!-- Avant --> <directoryBrowse enabled="true"/> <!-- Aprs --> </system.webServer> <!-- Aprs -->

Fichier Web.config Le fichier Web.config contient la configuration ASP.NET et WCF pour le projet web. Ce fichier est plac la fois la racine du projet, et donc la racine du site virtuel cr lors la premire publication par Visual Studio 2010. Nous nentrerons pas dans les dtails pour ce fichier, qui peut permettre des configurations relativement fines et pousses, mais nous survolerons les paramtres de configuration pour les lments qui nous intressent pour notre projet WSConnection.Web. Services Les services sont publis sur un annuaire par lintermdiaire du protocole WSDL, et sont utiliss par lintermdiaire du protocole SOAP/XML. Les dclarations sont regroupes en trois parties : les comportements, les mthodes dattachement, les services.

Prenons pour exemple la dclaration du service TwitterStatusService (possdant une interface ITwitterStatusService.cs et une classe implmentant ses fonctions TwitterStatusService.svc.cs).

23
Le fichier Web.config contient alors (des balises essentielles ont volontairement t tes par souci de clart, mais dont la prsence demeure indispensable dans le fichier) :
<?xml version="1.0"?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="WSConnection.Web.TwitterStatusServiceBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <customBinding> <binding name="WSConnection.Web.TwitterStatusService.customBinding0"> <binaryMessageEncoding /> <httpTransport /> </binding> </customBinding> </bindings> <services> <service behaviorConfiguration="WSConnection.Web.TwitterUserServiceBehavior" name="WSConnection.Web.TwitterStatusService"> <endpoint address="" binding="customBinding" bindingConfiguration="WSConnection.Web.TwitterUserService.customBinding0" contract="WSConnection.Web.ITwitterStatusService"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> </system.serviceModel> </configuration>

Dans le cas de services Silverlight-enabled WCF Service, il a fallu crer manuellement les fichiers interfaces. Il va donc de soi quil faille galement modifier manuellement les dclarations des services dans le fichier Web.config. Utilisez TwitterStatusService pour exemple et fates de mme pour les autres services. ASP.NET Utilisez les balises suivantes (en gras) afin dautoriser ASP.NET pour le projet web, dutiliser le framework .NET 4 et dautoriser le dbogage des services lors des excutions en mode debug :
<?xml version="1.0"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0"/> <pages controlRenderingCompatibilityVersion="4.0" clientIDMode="AutoID"/> </system.web> </configuration>

Constantes Le projet WSConnection.Web utilise quelques constantes. Il existe plusieurs manires de stocker des constantes pouvant tre modifies la vole par un administrateur du serveur web sans ncessiter la recompilation de lapplication (fichiers ressources (res, resx), fichiers plain text (xml, txt, ...), etc.). Il est galement possible dutiliser la section <appSettings></appSettings> du fichier Web.config. Les constantes stocker sont les deux cls publiques identifiant lapplication cliente sur twitter.com. En effet, twitter.com tient connatre les clients utilisant ses API, et demande pralablement lutilisateur connect au client utilisant les API dautoriser lapplication.

24

Figure 8 : Extrait d'une timeline montrant des twitts prcisant le nom de l'application ayant utilis les API de Twitter. Dans le cas de lutilisation du portail web http://twitter.com, le nom de lapplication est Web.

Avant cela, il faut crer une entre dapplication sur twitter.com depuis le compte utilisateur propritaire de lapplication. Pour notre part, nous avons cr une application nomme twittomator.

Figure 9 : Cls publique et secrte de l'application

25
Les identifiants de lapplication sont les cls Consumer key et Consumer secret. Cest grce elles que pour chaque commande par lAPI Twitterizer2 (qui communique directement avec les API RESTful de twitter.com), twitter.com sait quel est lmetteur de la commande. Ainsi, un twitt mis par Twitterizer2 en utilisant la mthode Update du service TwitterStatusService fera apparatre la mention via Twittomator.

Figure 10 : Affichage d'un twitt publi depuis le portail Web twitter.com et depuis les services de WSConnection.Web, en utilisant Twitterizer2 (pour lutilisateur twittomator).

Le fichier Web.config contiendra alors les deux constantes de la manire suivante, en rappelant que laccs depuis le code C# des lments du projet WSConnection.Web la section appSettings de Web.config se fait par la commande WebConfigurationManager.AppSettings["ConsumerKey"] et WebConfigurationManager.AppSettings["ConsumerSecret"] qui renvoient un type string. Communication avec twitter.com Les commandes envoyes lAPI RESTful de twitter.com par Twitterizer2 se distinguent en deux types de commandes : Les commandes prives (OAuth requests), qui demandent des informations et instructions propres un utilisateur particulier, et qui ncessitent les identifiants (credentials en anglais) de lutilisateur. Par exemple : publication dun twitt, suppression dun twitt personnel, demande pour suivre un utilisateur, etc. Les commandes publiques (regular requests), qui elles ne demandent pas didentifiants. Par exemple : consultation des twitts dun ou de plusieurs utilisateurs dont le profil est public, recherche dun utilisateur, etc.

Les identifiants sont contenues dans le lien HTTP qui forme la commande lAPI RESTful. Exemple dune commande prive (rcupration des twitts privs (messages privs) reus dans la bote de rception dun utilisateur) :
http://api.twitter.com/1/direct_messages.json?since_id=[...]&max_id=[...]&count=[...]&[chane_d_authe ntification]

En orange : paramtres propres la commande pour rcuprer les messages privs.

26
En bleu : base du lien pour rcuprer les messages privs. En vert : paramtres didentification dun utilisateur ; commun et identique pour toute commande prive. En noir : symboles utiliss dans une URL pour srialiser plusieurs paramtres et leurs valeurs. Les paramtres pour lidentification (OAuth 11) contenant une suite de paramtres et leurs valeurs (param1=[]&param2=[]&param3=[]). Les paramtres sont les suivants : Paramtre oauth_consumer_key Description Cl publique identifiant lapplication. Elle est rcuprer la dclaration de lapplication dans twitter.com (via portail web), cf. figure 9. Nombre alatoire gnr pour assurer lunicit de la demande. Mthode de hash pour signer la valeur de signature, partir de la cl secrte (Consumer secret, cf. figure 9). Twitter ne supporte que la mthode HMAC-SHA1, bien quil en existe dautres comme par exemple RSA. La valeur de lheure de la commande donne dans la base de temps UNIX (Epoch Time). Valeur de signature gnre partir de la cl secrte de lapplication, la mthode de signature, la valeur nonce, la valeur timestamp, la valeur oauth_consumer_secret, et la cl de lutilisateur stocke chez le client (oauth_token_secret). Cl publique de lutilisateur reue lors de la premire connexion au portail web. Version de la spcification de OAuth utilise. Twitter utilise la dernire version qui est la 1.0.

oauth_nonce oauth_signature_method

oauth_timestamp

oauth_signature

oauth_token oauth_version

A noter que le client Silverlight ne possde, et nest sens conserv que ces cls. Elles doivent tre donnes aux services pour chaque demande de commande prive) : oauth_token (cl publique de lutilisateur) oauth_token_secret (cl prive de lutilisateur, utilise pour fabriquer oauth_signature, mais napparat pas dans les url). Les services (le projet WSConnection.Web) ne possde que les cls prive et publique de lapplication (en tant que constantes dans Web.config) oauth_consumer_key (cl publique de lapplication) oauth_consumer_secret (cl prive de lapplication) Rappelons que les cls oauth_token et oauth_token_secret sont donnes au client lors de la toute premire demande dauthentification. Cest ensuite lui de les stocker (base de donnes locale, fichier cookie, variables dans lapplication, base de registres Windows, etc.).

11

http://oauth.net et http://p2p.wrox.com/content/articles/twitter-development-oauth-specification

27
Pour une vue plus globale sur le workflow de la mthode OAuth, veuillez vous rfrer au diagramme suivant :

Les paramtres de connexion de chaque commande (de Twitterizer2 vers twitter.com) dpendent de la mthode http utilise : GET ou POST. Dans le cas dune commande GET (demande dinformations : lecture de twitts, recherche dutilisateurs, etc.), tous les paramtres sont contenus dans lurl et trs peu dans len-tte. Par ex : URL
http://api.twitter.com/1/statuses/home_timeline.json?oauth_consumer_key=wqkLXN46UL ucOhQImtot8g&oauth_nonce=610190C&oauth_signature=lr4j1b3Tmhbvx7QrY%2B3njGlm P28%3D&oauth_signature_method=HMACSHA1&oauth_timestamp=1271002136&oauth_token=123179302hk1YLrRzQxcbgczHWHlSHGBaVjyXVXbcGIOrRPlw&oauth_version=1.0
User-Agent: Twitterizer/1.0.0.0

En-tte

Dans le cas dune commande POST (publication dinformations : rdaction dun twitt, envoi dun message priv un utilisateur, etc.), seuls les paramtres propres la fonction sont contenus dans lurl et la chane de connexion dans len-tte. URL En-tte
http://api.twitter.com/1/statuses/update.json?status=Le%20statut%que%je%publie
User-Agent: Twitterizer/1.0.0.0 Content-Type: application/x-www-form-urlencoded Authorization: OAuth realm="Twitter API",oauth_consumer_key="wqkLXN46ULucOhQImtot8g",oauth_nonce="73CC729E",oauth_signature_ method="HMAC-SHA1",oauth_timestamp="1271002459",oauth_token="123149312hk1YLrRzFxcbgdcBBHlSHGBaVjyXFFdEEIOrFV3w,oauth_version="1.0"

28
Tests
Les tests font lobjet dune part importante du dveloppement des services, dans la mesure o dune part larchitecture bi-intergicielle est relativement complexe et ncessite lassurance dune parfaite adquation et compatibilit, et dautre part car nus devons tre srs que chaque commande de services renvoie un rsultat en cas dchec et de russite. Chaque service est donc cod dans des espaces de traitements dexceptions. Bien quil soit gnralement inconcevable dans le dveloppement dune application rseau client/serveur multi-tiers de connatre tous les cas derreurs et dexceptions, la phase de tests doit permettre den connatre les principaux : erreurs dans le dveloppement (valeurs null, boucles infinies, etc.), erreurs dans les envois et retours entre Twitterizer2 et twiter.com (urls mal formes, erreurs http (401, 404, ), etc.).

Les tests se distingueront en deux parties : 1) tests fonctionnels, dont le but est de sassurer que chaque mthode fait ce quelle doit faire et renvoie ce qui est attendu. 2) Tests de compatibilit et de configuration pour Silverlight et .NET 4, afin de sassurer que les services et leurs commandes puissent tre invoqus depuis le client. Tests fonctionnels Pour les tests fonctionnels, il existe plusieurs faons de les excuter : depuis des clients dvelopps rapidement (consoles, winforms, ), depuis des clients spcialement prvus pour les tests de services WCF : WcfTesClient.exe depuis des dbogueurs Web, pour le dbogage des changes entre Twitterizer2 et twitter.com.

29

Figure 11 : Fiddler2 pour le dbogage Web (appels des services de WSConnection.Web, appels des API RESTful de twitter.com : GET/POST, etc.)

Dans un premier temps, assurez-vous que les services soient en mode dbogage dans Visual Studio 2010, en vrifiant, ou ajoutant, la ligne suivante dans votre fichier Web.config du projet WSConnection.Web :
<system.web> <!-avant --> <compilation debug="true" targetFramework="4.0"> <!-aprs --> </system.web>

Il faut tester les fonctions et par les trois faons indiques ci-avant. Nous en dtaillerons quune, savoir lutilisation du client WcfTestClient livr avec Visual Studio (par dfaut ladresse C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE). Pour commencer, connectez-vous un service :

30

Ajoutez le service Authentication.svc que nous avons publi sur le serveur IIS7 local, dans le rpertoire virtuel /WSConnection/Services.

Nous recevons alors toutes les fonctions du service (rappel : ce sont celles qui sont prcdent dans la dclaration des interfaces, par la directive [OperationContract]).

Nous allons prsent invoquer la premire commande, qui permet de demander twitter.com le lien pour nous authentifier sur twitter.com et autoriser laccs notre application (nomme Twittomator, cf. figure 9). Cette fonction a lavantage de ne pas demander de paramtre, car elle se contente dutiliser les constantes ConsumerKey et ConsumerSecret prsentent dans Web.config). Double-cliquez sur la fonction AskForAuthorizingLink() et cliquez ensuite sur le bouton Invoke. Le rsultat est le suivant :

31

On remarque que le type de la valeur de retour est bien le type contenu et dclar dans les classes de la librairie de classe WSConnection.Entities.Web (espace de nom WSConnection.Entities). Le type de retour est une structure (struct) dont la valeur returnedCode pouvait valoir soit OK, soit PROBLEM. Dans le cas dun succs (OK), la valeur de returnLink vaut bel et bien lurl du lien pour la connexion. Notez aussi que dans longlet XML du client, vous pouvez avoir accs aux codes XML de la requte (du proxy/client) et de la rponse (du service).

La seconde fonction du service (GetTokensFromOAuthTokens()) est charge de donner lutilisateur les valeurs (OAuth) oauth_token et oauth_token_secret, partir de la valeur oauth_token renvoye par twitter.com. Vous pouvez alors entrer cette valeur directement dans la zone paramtres de linvocation de la fonction pour la tester.

Tests pour client Silverlight Nous nallons pas entrer dans le dtail du dveloppement dune application Silverlight ni dans linvocation des services, car cette partie sera dveloppe dans la suite du document.

32
Cependant, notons que dans le cas des tests, il faut changer la valeur du timeout au bout duquel le client considre que lappel dune fonction dun service a chou. En effet, tant donn que lon va dboguer notre ensemble depuis lappel de la fonction dun service (depuis le projet Silverlight Test), jusqu la rception de lappel dans le service (projet WSConnection.Web), puis de WSConnection.Web Twitterizer2, nous allons prendre du temps (F10/F11 dans Visual Studio) et sans aucun doute dpasser les 1 minute de timeout par dfaut. Aprs avoir ajout tous vos services, vous devez avoir la configuration projet suivante :

A prsent, ditez le fichier ServiceReferences.ClientConfig afin dajouter les valeurs de timeout qui ne sont pas prsentes par dfaut (receiveTimeout et sendTimeout) :
<bindings> <customBinding> <binding name="CustomBinding_IAuthentication" receiveTimeout="00:10:00" sendTimeout="00:10:00"> <binaryMessageEncoding /> <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> </binding> <binding name="CustomBinding_ITwitterStatusService" receiveTimeout="00:10:00" sendTimeout="00:10:00"> <binaryMessageEncoding /> <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> </binding> <binding name="CustomBinding_ITwitterDirectMessageService" receiveTimeout="00:10:00" sendTimeout="00:10:00"> <binaryMessageEncoding /> <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> </binding> <binding name="CustomBinding_ITwitterUserService" receiveTimeout="00:10:00" sendTimeout="00:10:00"> <binaryMessageEncoding /> <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> </binding> </customBinding> </bindings>

Ajoutez ensuite votre page principale quelques composants (boutons, labels, grilles, etc.) afin de tester et afficher rapidement les rsultats des commandes. Un temps de 10 minutes devrait tre suffisant. Ces valeurs peuvent tre modifies la guise du lecteur.

33
Notez galement les valeurs de maxReceivedMessageSize qui correspondent la taille messages reus, typiquement des listes (ou collections, ou tableaux) qui peuvent volumineux dans le cas de nombreux twitts rcuprer en une seule commande exemple. Dans le cadre des tests qui se fait partir dun utilisateur de test qui na beaucoup de twitts ni publis ni lire (de ses amis ), une taille de 2 Go devrait tre quamplement suffisante des tre par pas plus

Pour pouvoir lancer le client tout en dbuggant les services, il faut configurer les projets Test et WSConnection.Web en tant que projets de dmarrage, et dsactiver le lancement dune page lors de lexcution du projet WSConnection.Web.

Figure 12 : Projets de dmarrage

Figure 13 : Dsactivation de la page de dmarrage

Plaons un bouton et une grille pour rcuprer une collection dlments.

34

Implmentons alors lvnement click comme suit :


private void buttonStatus_Click(object sender, RoutedEventArgs e) { TwitterStatusService.TwitterStatusServ ts.GetHomeTimeLinePrivateCompleted += new EventHandler<TwitterStatusService.GetHomeTimeLinePrivateCompletedEventArgs> (ts_GetHomeTimeLinePrivateCompleted); ts.GetHomeTimeLinePrivateAsync(tokens); busyIndicator1.IsBusy = true; }

La variable tokens est dfinie, par exemple au load de la MainForm, de la manire suivante :
tokens = new Tokens { AccessToken = "123179302-hk1YLrR...XVXbcGIOrRPlw", AccessTokenSecret = "VLpJZcrSgY5Vk...50lbN0iN7JFqAc" };

Elle est dclare comme variable de classe.


Tokens tokens;

Le composant busyIndicator1 est utilis afin de rendre compte du dbut et de la fin de lappel dune commande. Le handler de lappel est le suivant :
public void ts_GetHomeTimeLinePrivateCompleted(object sender, TwitterStatusService.GetHomeTimeLinePrivateCompletedEventArgs e) { busyIndicator1.IsBusy = false; try { MessageBox.Show(e.Result.Count<Status>().ToString()); if (e.Result.Count<Status>() > 0) { UserCollection uc = new UserCollection(); uc.Add(e.Result[0].User); dataGrid2.ItemsSource = uc; } dataGrid1.ItemsSource = e.Result; } catch (Exception e)

35
{ MessageBox.Show(e.Message); } }

Le rsultat, sil sest bien pass (avec ou sans points darrts), est le suivant :

Aprs quelques tests des fonctions principales de chaque service (User, Status, Authentication, DirectMessage), sous diffrents contextes dexcutions (envois massifs de commandes, excutions simultanes depuis plusieurs navigateurs, connexion/dconnection Internet, etc.).

Client
Fonctionnalits Voici une liste de quelques fonctionnalits du client Silverlight dans sa premire version bta : Application Silverlight 4 en mode browser et out of browser Authentification oath via Twitter Affichage de la HomeTimeLine Affichage des Mentions Affichage des DirectMessages Affichage des friends Affichage des followers Affichage de rsultats de recherche Envoi de twitts et limitation en temps rel du nombre de caractres restants Url Shortner

36

Figure 14 : Vue sur la page principale de Twittomator

Initialisation de la solution Le projet consiste en une solution disposant de plusieurs projets : 1) Le projet Silverlight Application (Visual C# - .NET 4) principal. Il sera nomm Twittomator.

Ce projet contiendra : Lapplication Silverlight en elle-mme (front office ct utilisateur) avec toutes les vues ncessaires lapplication (connection, dashboard, templates) mais aussi les rfrences aux services web offerts par la couche back office.

On notera la cration automatique dun projet Web Twittomator.web qui contient les pages aspx (et html) qui appellent le fichier Silverlight compil (.xap) dans le rpertoire ClientBin du projet Web. 2) Un projet Silverlight Application (Visual C# - .NET 4), nomm Blacklight Controls.

37

Ce projet contiendra : Les fichiers sources du projet Blacklight, nous utiliserons notamment les composants DragDockPanel et DragDockPanelHost personnaliss. Le fichier de skin personnalis.

Blacklight, Silverlight Toolkit et ressources externes

1) Blacklight est un ensemble de contrles (thmes, animations, panels, players ) dvelopps pour Silverlight disponible sur la forge des projets .NET de codeplex.com : http://blacklight.codeplex.com/Wikipage, en tlchargement gratuit. Cest un projet WPF et pas uniquement Silverlight, et le package tlcharger contient entre autres plusieurs exemples dutilisations ainsi quun showcase (dmo en ligne : http://mightymeaty.members.winisp.net/blacklight.silverlight/). Nous nous intresserons au projet source nomm Blacklight.Controls et aux controls DragDockPanel et DragDockPanelHost :

Les deux composants ci-dessus ont t personnaliss (thme) de manire obtenir un nouveau contrle Silverlight qui peut tre rduit, maximis, gliss et ferm. Cette fentre permettra dafficher le rsultat des diffrentes commandes utilisateur (timeline, mentions, direct message ). Le composant DragDockPanel quant

38
lieu permet de grer plusieurs DragDockPanel et deffectuer des oprations sur les fentres quil contient.

Il suffit de rajouter la rfrence vers le projet Blacklight.Controls dans le projet courant et de rajouter la ligne suivante dans le XAML du UserControl :
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ... xmlns:controls="clr-namespace:Blacklight.Controls;assembly=Blacklight.Controls" ... > ... <controls:DragDockPanelHost x:Name="dragDockPanelHost /> ... </UserControl>

[Se rfrer au code source pour en savoir plus sur la personnalisation de ce composant] 2) A limage de Blacklight, Silverlight Toolkit est un projet codeplex gratuit qui propose un ensemble de controls Silverlight avancs pour Silverlight 4 : datagrid, thmes, childWindow, autocompletebox, etc. Il est disponible ladresse suivante http://mightymeaty.members.winisp.net/blacklight.silverlight/ , et un showroom de tous les contrles est accessible ici : http://silverlight.net/content/samples/sl4/toolkitcontrolsamples/run/default.html

39

En loccurrence pour Twittomator, nous utiliserons le thme Expression Light inclut dans le toolkit, et ce de la manire suivante :
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ... xmlns:expressionLight="clrnamespace:System.Windows.Controls.Theming;assembly=System.Windows.Controls.Theming.Expressi onLight" ...> <expressionLight:ExpressionLightTheme> <Grid x:Name="LayoutRoot" OpacityMask="White"> ... </Grid> </expressionLight:ExpressionLightTheme> </UserControl>

Nous utiliserons aussi le contrle ChildWindow pour une fentre de type about : (Silverlight Toolkit installe aussi des templates de composants dans lassistant dajout).

Enregistrement dinformation ct client : Isolated Storage

Silverlight utilise Isolated Storage, qui est un systme de fichier virtuel qui permet de stocker des informations applicatives de manire locale, chez lutilisateur. Cest une meilleure alternative aux cookies, surtout lorsquil sagit de travailler avec beaucoup de donnes stocker. Aussi, il permet de partager les informations stockes depuis plusieurs navigateurs (ce

40
qui nest pas le cas des cookies) ou en mode OOB (Out of Browser). Chaque application Silverlight peut avoir sa disposition 1 MO despace (valeur par dfaut extensible), moins quun administrateur nait prvu le contraire (cest pour cela quil faut prvoir ce cas de figure dans son code). En loccurrence, pour Twittomator, il est ncessaire de stocker au moins deux valeurs pour ne pas avoir se loguer chaque fois. Voici comment utiliser lisolated storage pour les valeurs ConsumerKey et ConsumerKeySecret en utilisant une classe statique :
// Classe statique UserSettings qui utilise lisolated storage public static class UserSettings { const string KEY1 = "ConsumerKey"; const string KEY2 = "ConsumerKeySecret"; const string NULLVALUE = "0"; // check si l'utilisateur s'est dj connect public static bool hasCredentials() { return ((Read((string)KEY1, NULLVALUE) != NULLVALUE) && (Read((string)KEY2, NULLVALUE) != NULLVALUE)); } public static Tokens returnCredentials() { Tokens tokens; tokens = new Tokens { AccessToken = Read((string)KEY1, NULLVALUE), AccessTokenSecret = Read((string)KEY2, NULLVALUE) }; return tokens; } public static void saveCredentials(string val1, string val2) { Write(KEY1, val1); Write(KEY2, val2); } public static TT Read<TT>(string name) { return Read<TT>(name, default(TT)); } public static TT Read<TT>(string name, TT defaultValue) { IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings; TT value; if (settings == null || !settings.TryGetValue<TT>(name, out value)) return defaultValue; return value; } public static void Write<TT>(string name, TT value) { IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings; if (settings == null) return; if (settings.Contains(name)) settings[name] = value; else

41
settings.Add(name, value); settings.Save(); } }

Intgration des services Web Il va de soi, et cela a t expliqu au dbut de ce document, que lapplication Silverlight fera appel aux services web mis disposition par le back office. Pour ce faire, nous nous devons dabord de rajouter les rfrences aux services web dans le projet Twittomator, et cela de la manire suivante : 1) Faire un clic droit sur References et choisir Add Service Reference

2) Ajouter lurl du service Web (dans notre cas il est hberg en local) et cliquer sur Go . Si lopration se passe bien, lassistant doit pouvoir lister les mthodes disponibles. Dans ce cas, donner un nom pour lespace de noms (namespace) et valider.

3) Maintenant que la rfrence a t ajoute, nous pouvons utiliser le nouveau namespace WsTwitterUser comme suit (il peut par exemple sagir du bout de code correspondant au clic sur un bouton Friends List ) :
private void buttonFriends_Click(object sender, RoutedEventArgs e) { if (AddPanel(this.defaultMargin, this.moduleName, new LoadingAnimation())) {

42
ProgressStart(); stBar.Text = "Friends list"; WsTwitterUser.TwitterUserServiceClient ts = new WsTwitterUser.TwitterUserServiceClient(); ts.GetFriendsCompleted += new EventHandler<WsTwitterUser.GetFriendsCompletedEventArgs>(ts_GetFriendsCompleted); // appel asynchrone la fin ts.GetFriendsAsync(this.tokens); ProgressEnd(); } }

4) Handler qui se dclenche quand survient lvnement completed


public void ts_GetFriendsCompleted(object sender, WsTwitterUser.GetFriendsCompletedEventArgs e) { try { if (e.Result.Count<User>()> 0) { string header = "Friends"; UserInfo users = new UserInfo(e.Result.ToList<User>()); this.panels[this.panels.Count - 1].Header = header; this.panels[this.panels.Count - 1].Content = users; } } catch (Exception ex) { MessageBox.Show(ex.StackTrace); } }

Mcanisme de Callback (twitter)

Lapplication twitter cre permet de spcifier une URL de Callback . Cette URL spciale permet de grer le retour dauthentification de twitter et enregistre les paramtres qui lui sont retourns laide de lIsolated Storage.

43
MOOB (Mode Out of browser) Le mode OOB permet aux applications Silverlight de pouvoir sexcuter comme une application Desktop classique. Pour pouvoir activer cette fonctionnalit, il suffit daller sur les proprits du projet Silverlight (Twittomator), dactiver le mode out of browser et de renseigner les informations sur lapplication comme suit :

Supposons que lon veuille installer lapplication via un bouton install qui dtecte si lapplication est installe ou pas lors de son lancement. Dans ce cas, voici le code utiliser pour ce faire :
// linitialisation de lapplication if (Application.Current.InstallState == InstallState.Installed) { this.buttonInstall.Visibility = Visibility.Collapsed; } // au clic sur le bouton install private void buttonInstall_Click(object sender, RoutedEventArgs e) { Application.Current.Install(); }

Quand lutilisateur clique sur le bouton install , une fentre modale saffiche et lui demande les emplacements o il veut installer lapplication :

44

Figure 15 : Twittomator en mode OOB (installation)

Figure 16 : Twittomator en mode OOB (excution)

45
Dploiement et hbergement
Les solutions (solution WSConnection et solution Twittomator) sont dployes sur un serveur Windows 2008 R2 64 bits. Nous nentrerons pas en dtail sur la configuration du serveur, mais sur les points cls pour la configuration Silverlight, WCF et .NET 4. Pour la connexion au serveur (distant), nous utilisons un client TSE nomm Tunnelier, qui permet dutiliser le protocole RDP travers un proxy. Lobjectif tant dutiliser RDP lorsque votre connexion Internet directe ne vous le permet pas cause de filtres sur ports et protocoles (rseau dentreprise, rseau universitaire, etc.). Le proxy utilis lhte local sous SOCKS5, travers du proxy forwarding depuis une connexion SSH distante.

Configuration IIS
Le serveur distant possde un service IIS7. Il reste la configurer afin quil puisse excuter des applications WCF/ASP.NET 4.

46

Figure 17 : Environnement Windows 2008 R2

Installation de WCF Linstallation se fait de la mme manire que celle dcrite dans ce qui prcde dans ce document (partie Projet WSConnection.Web/Services/Configuration IIS). Il faut sassurer que .NET 3 soit install et excuter la commande :
C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation/ServiceModelReg.exe i

Installation de .NET4 Pour installer le framework .NET 4, il faut veiller prendre la version de larchitecture du serveur. Dans ce cas, ce sera la version x64 ( la diffrence de la version 32 bits utilise sur les postes de dveloppement). Excutez ensuite :
C:\Windows\Microsoft.NET\Framework\v4.0.30128\aspnet_regiis.exe i

Dploiement du projet WSConnection.Web Il faut livrer les sources du projet sur le serveur distant. Il existe plusieurs manires de le faire : par connexion ftp (envoi depuis Visual Studio 2010 en tant que publication chaque compilation). Mthode dconseille dans le cas dune toute premire publication, mais bien pratique ensuite, par connexion ftp directe (service ftp sur IIS7, puis envoi partir dun client ftp), autres (envoi/rception partir de serveurs de stockages, etc.).

47
Dans notre cas, nous envoyons les sources du projet WSConnection.Web par un serveur ftp intermdiaire, puis nous les rcuprons laide du client ftp filezilla depuis le serveur distant. Elles sont ensuite places dans un rpertoire local du serveur (par ex. C:\inetpub\wwwRoot). Notons que nous nenvoyons que le projet WSConnection.Web et pas les autres (Twitterizer2, WSConnection.Entities.WSConnection.Silverlight, WSConnection.Entities.Web), car ils sont prsents en versions compiles (DLLs) dans le rpertoire bin du projet. Crons prsent le rpertoire virtuel WSConnection sur IIS7 distant, partir de la racine Default Web Site.

Il faut se connecter en tant quutilisateur ayant les droits sur le dossier son emplacement physique. Dans le cas de non mention dun utilisateur, IIS utilisera lidentit anonyme par dfaut IUSR, dont les droits (lecture/criture) sur le chemin en question nest pas assure.

Pour notre part, nous avons utilis lutilisateur Administrateur.

48

La spcification de .NET 4 sur architecture 64bits diffre lgrement de celle sur 32bits, ce qui nous oblige adapter certains paramtres du fichier Web.config. Dans notre cas, il sagit seulement de la ligne : La directive pour autoriser le dbogage doit tre supprime, car nous sommes prsent en mode release.
<system.web> <!--avant--> <compilation debug="true" targetFramework="4.0"> <!--aprs--> </system.web>

A modifier ainsi : <system.web> <!--avant-->


<compilation debug="false" targetFramework="4.0">

<!--aprs--> </system.web> De plus, nous avons ajout une fonction qui sexcute et traite chaque exception (dans les instructions catch), et qui se charge de loger dans un fichier le libell de chaque exception en plus de la date et heure, du nom du service concern, et de la mthode dans laquelle lexception a eu lieu.

49

Figure 18 : contenu du fichier debug.txt dont le nom et l'adresse sont indiqus en tant que paramtre de l'application WCF, dans le fichier Web.config (veillez avoir les droits sur le fichier)

Dploiement du client Twittomator On procde de la mme manire que pour le dploiement du projet WsConnection.web, mais cette fois ci avec le projet web Twittomator.web. Accs et scurit La communication entre clients et services sur architecture WCF ncessite prend en compte des paramtres de scurit. Il en existe plusieurs, cependant nous nen aborderons quun seul. Il sagit des droits que donne une application de services WCF (en loccurrence WSConnection.Web) des clients pour sy connecter et les utiliser. Pour ce faire, le projet par lintermdiaire de son fichier de configuration Web.config donne la possibilit dautoriser ou dinterdire la communication SOAP avec certains clients. Cette exclusion se concentre sur le domaine sur lequel se trouve lappelant (le client, aussi appel proxy). Cette configuration sopre au niveau de deux fichiers : clientaccesspolicy.xml et crossdomain.xml. Notez que si vous rencontrez mme lors de la phase de tests (clients et services sur mme poste local (localhost)), veuillez paramtrer ces fichiers comme suit 12 pour garantir une autorisation totale :
----------------------------- clientaccesspolicy.xml ------------------------------<?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="*"/> </allow-from>
12

Spcification conseille par Microsoft (http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx)

50
<grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy> -------------------------------------------------------------------------------------------

Ceci indique que nous autorisons toutes formes de requtes ( SOAP* , X-API-* , etc.), et de toutes origines de clients.
----------------------------- crossdomain.xml -------------------------------------<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domainpolicy.dtd"> <cross-domain-policy> <allow-http-request-headers-from domain="*" headers="*"/> </cross-domain-policy> -------------------------------------------------------------------------------------------

Ceci indique que nous autorisons toutes origines de requtes clientes. Ce fichier nest pas indispensable, car il se contente dcraser la configuration existante dans clientaccesspolicy.xml, au niveau de la balise <domain uri="*"/> et <allow-from http-requestheaders="*">. Dans le cas du mode release, dans la mesure o le client Silverlight (Twittomator) et les services (WSConnection.Web) sont tous deux hbergs sur le mme serveur, nous nallons autoriser que les requtes locales. Par consquent, indiquez le domaine du serveur dans la valeur de lattribut domain. Dans le cas de notre serveur, il sagit de la configuration suivante :
<allow-from http-request-headers="*"> <domain uri="http://lb-webpi-4976v.maplateformeweb.com"/> </allow-from> <cross-domain-policy> <allow-http-request-headers-from domain="*" headers="http://lb-webpi4976v.maplateformeweb.com"/> </cross-domain-policy>

Les fichiers clientaccesspolicy.xml et crossdomain.xml doivent tre placs la racine du serveur web, cest--dire dans le rpertoire de Default Web Site dans notre cas. Ce rpertoire est celui par dfaut, savoir C:\inetpub\wwwRoot\.

Evolutions Gnricit
Les services WCF ont lavantage dtre utilisables par tout client dvelopp en .NET4. Cependant pour tre compatible avec des clients danciennes versions, il faudrait recompiler les projets WSConnection.Web, WSConnection.Entities.Web sous .NET <4 (3.0 ou 3.5). De mme pour le projet WSConnection.Silverlight compiler sous Silverlight 3. Dans ce cas des clients SIlverlight 3 sous .NET 3+ pourront utiliser les services et les librairies de classes.

51
Dans le cas de clients de types diffrents (Web ASP, console, WPF, WinForm, etc.), il faudrait en plus de recompiler WSConnection.Web et, WSConnection.Entities.Web sous la mme version de .NET, utiliser un projet de librairie de classes propre au client. Par exemple pour un client WinForm, il faudrait un projet WSConnection.Entities.Silverlight en tant que Class Library (et non plus Silverlight Class Library), renomm avec smantique adapte et compile sous la mme version de .NET que celle du client et celle de la libraire de classes miroir, savoir WSConnection.Entities.Web. De plus, la sparation volontaire des services par services mtiers permet des clients de ne pas forcment avoir rcuprer tous les services sil ne souhaite que faire de la lecture de messages directs (twitts directs), ou uniquement de la lecture/modification de profil.

Dploiement
Un dploiement sur la plateforme Windows Azure est toute fait envisageable, nous pensons faire cela pour les prochaines versions.

Remerciements
Nous tenons remercier M. Yves Boutemy qui dans le cadre doption transversale de 5 e anne INSA-IF, nous a permis de nous initier aux services Web WCF, aux technologies .NET plus gnralement, ainsi qu ladministration de serveurs Windows 2008 R2. Par ailleurs, ce projet naurait pas pu se faire sans les ressources en ligne grce auxquelles les dveloppements ont pu aboutir (tutoriels, documentation, forums de discussion, etc.).. Nous remercions galement Microsoft pour ses outils mises gratuitement la disposition des utilisateurs (Visual Studio 2010 RC et Silverlight 4 Framework notamment), pour son aide en ligne (MSDN) et sa communaut de professionnels sur leurs forums. Sans oublier de citer la forge dapplication .Net Codeplex, le site dintrt gnral .NET StackOverFlow ainsi que lexcellant blog de timheuer, Program Manager chez Microsoft. Ressources : Le blog de Tim Heuer : http://timheuer.com/blog/ Stackoverflow : http://stackoverflow.com/ CodePlex : http://www.codeplex.com/ Tutorials Silverlight : www.silverlight.net/learn/tutorials/ Silverlight Toolkit : http://silverlight.codeplex.com/Wikipage Blacklight Toolkit : http://blacklight.codeplex.com/ API Twitter : http://apiwiki.twitter.com/