<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7994229971187218600</id><updated>2011-04-21T13:26:59.293-07:00</updated><category term='google account'/><category term='sds'/><category term='WebService'/><category term='authority'/><category term='Web role'/><category term='web'/><category term='REST'/><category term='Cloud Computing'/><category term='azure'/><category term='RestLet'/><category term='cloud'/><category term='Java'/><category term='Web service'/><category term='entity'/><category term='JavaFX'/><category term='SOAP'/><category term='Silverlight Streaming API'/><category term='Microsoft Techdays 2009'/><category term='Soutenance'/><category term='copy'/><category term='WCF'/><category term='container'/><category term='live id'/><category term='Silverlight Streaming Service'/><category term='authentification'/><category term='open id'/><category term='.net'/><category term='sql data services'/><category term='Diaporama'/><category term='SLS'/><category term='Sourceforge'/><category term='Silverlight Streaming'/><category term='deploy'/><category term='Amazon Web Services Associates'/><title type='text'>A la recherche du cumulo-codus !</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Maxime Britto</name><uri>http://www.blogger.com/profile/12048362267455309200</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-8559452147807264092</id><published>2009-02-06T00:06:00.000-08:00</published><updated>2009-02-06T02:40:02.391-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Soutenance'/><category scheme='http://www.blogger.com/atom/ns#' term='Sourceforge'/><category scheme='http://www.blogger.com/atom/ns#' term='Diaporama'/><title type='text'>Présentation du projet</title><content type='html'>Hier, nous avons présenté notre projet devant le jury de soutenance composé de :&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.sfartz.com/"&gt;Steve Sfartz&lt;/a&gt;, Architecte Senior, Microsoft France&lt;/li&gt;&lt;li&gt;&lt;a href="http://lucien34.wordpress.com/"&gt;Lucien Martos&lt;/a&gt;, Responsable Génie Logiciel, EPSI Montpellier&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.epsi.fr/ecole-ingenieur-informatique,montpellier,ville-intro,.html"&gt;Sylvie Malézieux&lt;/a&gt;, Directrice Régionale, EPSI.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Les retours que nous avons obtenus sont très positifs et la présentation a eu beaucoup de succès.&lt;br /&gt;Les démonstrations ont permis d'illustrer  le fonctionnement et la stabilité de l'architecture.&lt;br /&gt;Voici le diaporama que nous avons présenté ce jeudi : &lt;a href="http://clouditup.svn.sourceforge.net/viewvc/clouditup/Documents%20divers/Soutenance%20finale/epsi_clouditup_webservices.pdf"&gt;Diaporama&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Nous rappelons que l'ensemble du projet est&lt;a href="http://sourceforge.net/projects/clouditup"&gt; disponible sur Sourceforge&lt;/a&gt; et que chacun a la possibilité de télécharger librement le code pour l'étudier ou le déployer.&lt;br /&gt;&lt;br /&gt;Nous préparons actuellement un guide de déploiement expliquant les installations nécessaires au bon fonctionnement de la solution. Il sera bientôt disponible sur ce blog.&lt;br /&gt;&lt;br /&gt;En attendant, nous restons disponibles pour toute question sur le projet ou l'interopérabilité.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-8559452147807264092?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/8559452147807264092/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=8559452147807264092' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/8559452147807264092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/8559452147807264092'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/02/soutenir-et-justifier.html' title='Présentation du projet'/><author><name>Maxime Britto</name><uri>http://www.blogger.com/profile/12048362267455309200</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-3260893418025022006</id><published>2009-02-03T23:49:00.000-08:00</published><updated>2009-02-04T00:17:17.441-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft Techdays 2009'/><category scheme='http://www.blogger.com/atom/ns#' term='azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud Computing'/><title type='text'>Microsoft Techdays 2009 : il y aura du cloud computing</title><content type='html'>Comme vous le savez certainement, le salon des Techdays de Microsoft se tiendra du 10 au 12 février au Palais des Congrès de Paris. &lt;div&gt;Ce sera l'occasion pour Microsoft de détailler et d'expliquer le fonctionnement de la plateforme de développement Azure.&lt;br /&gt;Sur le TechBlog de Microsoft, vous pouvez voir &lt;a href="http://blogs.technet.com/mstechdays/archive/2009/02/02/microsoft-techdays-2009-un-avant-go-t-du-parcours-cloud-computing.aspx"&gt;une interview de Thomas Lucchini&lt;/a&gt; (Microsoft France) qui annonce les différentes sessions qui toucheront au cloud computing. Pour notre part, nous assisterons au moins à celle de &lt;a href="http://galilee.microsoft.fr/TechDays2009/Speaker.aspx?SpkID=58413342-5cb7-40a2-96bb-a24b41bd9cc9"&gt;Steve Sfartz&lt;/a&gt; ainsi que celle de &lt;a href="http://www.bloginthecloud.com/"&gt;Ronny Kwon&lt;/a&gt; le &lt;a href="http://galilee.microsoft.fr/TechDays2009/Session.aspx?CellID=04886d44-ded2-4872-8260-034149045a2e"&gt;mardi 10 février&lt;/a&gt;, car ils devraient parler de Silverlight Streaming, de Azure et ... de notre projet !&lt;br /&gt;&lt;br /&gt;Si vous vous rendez aux Techdays pour cette édition 2009, profitez-en pour venir nous rencontrer au stand &lt;a href="http://www.epsi.fr/"&gt;EPSI&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-3260893418025022006?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/3260893418025022006/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=3260893418025022006' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/3260893418025022006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/3260893418025022006'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/02/microsoft-techdays-2009-il-y-aura-du.html' title='Microsoft Techdays 2009 : il y aura du cloud computing'/><author><name>Maxime Britto</name><uri>http://www.blogger.com/profile/12048362267455309200</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-1836811405892566976</id><published>2009-02-03T14:28:00.000-08:00</published><updated>2009-02-03T17:14:39.226-08:00</updated><title type='text'>Faire part de naissance.</title><content type='html'>En ce beau jour que fut le 03 Février 2009, la magie de la vie a permis à&lt;br /&gt;&lt;br /&gt;&lt;a href="http://voditup.cloudapp.net/"&gt;http://voditup.cloudapp.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;qui pèse 10Mo et mesure plusieurs milliers de lignes de codes de voir enfin le jour sous le regard attendri de ses parents.&lt;br /&gt;&lt;br /&gt;Il faudra bien sûr du temps et la patience pour qu'il grandisse et atteigne un développement adulte et mature.&lt;br /&gt;&lt;br /&gt;Trève de plaisanterie, l'équipe clouditup est heureuse de vous présenter la version béta de notre site de VOD (Utilisant des technologies Microsoft telles que Silverlight Streaming Platform, SQL Data Services, Azure queue et table...)&lt;br /&gt;&lt;br /&gt;Maxime, Léo , Sébastien et Mathieu.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;- Consultez les nouveautés &lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_9jevx37O5Iw/SYjqpOQfQSI/AAAAAAAAAGs/C98n_6OrAR8/s1600-h/demo_vod.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5298742955524178210" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 296px; CURSOR: hand; HEIGHT: 150px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_9jevx37O5Iw/SYjqpOQfQSI/AAAAAAAAAGs/C98n_6OrAR8/s400/demo_vod.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;- Consultez des fiches de film&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_9jevx37O5Iw/SYjq6GcvUTI/AAAAAAAAAG0/pxxq66hbZc8/s1600-h/demo_vod4.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5298743245485855026" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 295px; CURSOR: hand; HEIGHT: 184px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_9jevx37O5Iw/SYjq6GcvUTI/AAAAAAAAAG0/pxxq66hbZc8/s400/demo_vod4.jpg" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;- Consultez vos locations&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_9jevx37O5Iw/SYjrGtjmVQI/AAAAAAAAAG8/bBzJFjdmZDY/s1600-h/demo_vod3.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5298743462142039298" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 304px; CURSOR: hand; HEIGHT: 188px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_9jevx37O5Iw/SYjrGtjmVQI/AAAAAAAAAG8/bBzJFjdmZDY/s400/demo_vod3.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;- Et surtout, visionnez vos films !&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/_9jevx37O5Iw/SYjrRmqzlKI/AAAAAAAAAHE/Kd5kB_a_CKQ/s1600-h/demo_vod2.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5298743649271780514" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 296px; CURSOR: hand; HEIGHT: 184px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_9jevx37O5Iw/SYjrRmqzlKI/AAAAAAAAAHE/Kd5kB_a_CKQ/s400/demo_vod2.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-1836811405892566976?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/1836811405892566976/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=1836811405892566976' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/1836811405892566976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/1836811405892566976'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/02/faire-part-de-naissance.html' title='Faire part de naissance.'/><author><name>Mathieu Chenu</name><uri>http://www.blogger.com/profile/13228294691073267108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9jevx37O5Iw/SYjqpOQfQSI/AAAAAAAAAGs/C98n_6OrAR8/s72-c/demo_vod.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-8014637670932984951</id><published>2009-02-02T15:29:00.000-08:00</published><updated>2009-02-03T19:02:34.488-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='deploy'/><category scheme='http://www.blogger.com/atom/ns#' term='azure'/><title type='text'>Windows Azure : Comment déployer un projet volumineux ?</title><content type='html'>Lorsque vous développez un projet Cloud WebRole pour Azure qui est volumineux, il se peut que vous soyez confrontés à l'erreur suivante lorsque vous essaierez de publier ("Publish") votre solution :&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Error 41 The "CSPack" task failed&lt;br /&gt;unexpectedly.System.IO.IsolatedStorage.IsolatedStorageException: Unable to&lt;br /&gt;determine the identity of domain. at&lt;br /&gt;System.IO.IsolatedStorage.IsolatedStorage._GetAccountingInfo(Evidence evidence,&lt;br /&gt;Type evidenceType, IsolatedStorageScope fAssmDomApp, Object&amp;amp;&lt;br /&gt;oNormalized) at&lt;br /&gt;System.IO.IsolatedStorage.IsolatedStorage.GetAccountingInfo(Evidence evidence,&lt;br /&gt;Type evidenceType, IsolatedStorageScope fAssmDomApp, String&amp;amp; typeName,&lt;br /&gt;String&amp;amp; instanceName) at&lt;br /&gt;etc...&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Cette erreur indique que Visual Studio ne peut pas "packager" le projet.&lt;/p&gt;&lt;p&gt;La solution réside dans un utilitaire fournit avec Azure SDK. Ouvrez l'invité de commande du SDK, et utilisez "cspack" de la manière suivante :&lt;/p&gt;&lt;p&gt;- positionnez vous dans le dossier racine de votre solution (celui proposant un dossier pour le WebRole et un dossier pour la solution).&lt;br /&gt;- tapez la commande suivante (avec vos valeurs bien entendu) :&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;cspack DossierDeLaSolution\ServiceDefinition.csdef&lt;br /&gt;/role:WebRole;DossierDuWebRole /out:NomDuPackage.cspkg&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_9jevx37O5Iw/SYeFIiKjU-I/AAAAAAAAAGk/cyB2ILdVMEg/s1600-h/azure_sdk_tool.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5298349868281189346" style="margin: 0px auto 10px; display: block; width: 400px; height: 195px; text-align: center;" alt="" src="http://3.bp.blogspot.com/_9jevx37O5Iw/SYeFIiKjU-I/AAAAAAAAAGk/cyB2ILdVMEg/s400/azure_sdk_tool.jpg" border="0" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;Le package est publié manuellement, et vous pouvez maintenant l'uploader sur votre compte Azure afin d'effectuer vos tests.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-8014637670932984951?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/8014637670932984951/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=8014637670932984951' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/8014637670932984951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/8014637670932984951'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/02/windows-azure-comment-deployer-un.html' title='Windows Azure : Comment déployer un projet volumineux ?'/><author><name>Léo Pratlong</name><uri>http://www.blogger.com/profile/06248885726738094783</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9jevx37O5Iw/SYeFIiKjU-I/AAAAAAAAAGk/cyB2ILdVMEg/s72-c/azure_sdk_tool.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-4334963647946137054</id><published>2009-01-31T17:32:00.001-08:00</published><updated>2009-01-31T17:48:11.783-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight Streaming'/><title type='text'>Silverlight Streaming : Problème lors de l'upload depuis l'interface</title><content type='html'>Il semblerait que Silverlight Streaming connaisse un problème lors de l'upload d'une vidéo depuis l'interface web (&lt;a href="http://silverlight.live.com/"&gt;http://silverlight.live.com/&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Après renseignement, cette erreur n'est visiblement pas fréquente. Néanmoins, je vous l'expose :&lt;br /&gt;&lt;br /&gt;Pour le développement de notre projet, nous avons mis quelques vidéos sur la plateforme Silverlight Streaming afin d'effectuer nos tests.&lt;br /&gt;&lt;br /&gt;Nous avons uploadé une vidéo d'environ 50 Mo. Une fois sur le serveur, elle affiche plus de 5 Go. Soit environ 100 fois plus.&lt;br /&gt;Un algorithme de compression ou autre ne justifie pas cette différence, puisqu'aucun algorithme de streaming ne multiplie la taille du fichier par 100. Un autre point étrange est que lorsque l'on consulte cette vidéo, nous devrions théoriquement mettre 5000 secondes (à hauteur de 1 Mo / seconde en download) pour pouvoir la télécharger entièrement, et donc la consulter jusqu'à la fin. Mais en l'occurrence, la consultation est très rapide et la lecture ne se bloque à aucun moment pour charger la suite de la vidéo.&lt;br /&gt;&lt;br /&gt;(Précisons que cet évènement est apparu à chaque upload de vidéo que nous avons fait par l'interface web de Silverlight Streaming)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Une image étant plus probante que de longues palabres, je vous laisse juger de cette "bizarerie" :&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_9jevx37O5Iw/SYT-oIOYMiI/AAAAAAAAAGc/5vh3dGTVnLc/s1600-h/bug_sls_exemple.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5297639027050557986" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 250px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_9jevx37O5Iw/SYT-oIOYMiI/AAAAAAAAAGc/5vh3dGTVnLc/s400/bug_sls_exemple.jpg" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-4334963647946137054?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/4334963647946137054/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=4334963647946137054' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/4334963647946137054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/4334963647946137054'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/01/silverlight-streaming-probleme-lors-de.html' title='Silverlight Streaming : Problème lors de l&apos;upload depuis l&apos;interface'/><author><name>Léo Pratlong</name><uri>http://www.blogger.com/profile/06248885726738094783</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9jevx37O5Iw/SYT-oIOYMiI/AAAAAAAAAGc/5vh3dGTVnLc/s72-c/bug_sls_exemple.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-8422573374274890317</id><published>2009-01-30T15:40:00.001-08:00</published><updated>2009-01-30T16:39:53.253-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight Streaming'/><category scheme='http://www.blogger.com/atom/ns#' term='azure'/><category scheme='http://www.blogger.com/atom/ns#' term='sql data services'/><category scheme='http://www.blogger.com/atom/ns#' term='WebService'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Service Azure de gestion des URL temporaires pour Silverlight Streaming</title><content type='html'>Le service de gestion des URL temporaires pour Silverlight Streaming est maintenant terminé.&lt;br /&gt;&lt;br /&gt;Il permet de récupérer une URL temporaire (le temps est paramétrable. Il est pour l'instant initialisé à 400 secondes) donnant accès à une vidéo copiée. L'intérêt est d'empécher la lecture de la vidéo une fois le temps de location expiré.&lt;br /&gt;&lt;br /&gt;Pour ce faire, on utilise un projet Cloud contenant un WebRole et un WorkerRole. Le schéma suivant montre les appels effectuaient par notre service vers d'autres services.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9jevx37O5Iw/SYOdJEect6I/AAAAAAAAAGU/0J36jYjut8o/s1600-h/service_azure.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 255px;" src="http://2.bp.blogspot.com/_9jevx37O5Iw/SYOdJEect6I/AAAAAAAAAGU/0J36jYjut8o/s400/service_azure.jpg" alt="" id="BLOGGER_PHOTO_ID_5297250365863671714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;WebRole&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Il expose un service REST contenant l'opération doCopy(string upc). Cette opération va lancer une recherche sur SQL Server Data Services (accès en SOAP) de toutes les locations concernant la vidéo en question. Notre nouvelle vidéo portera comme nom la concaténation de l'upc et du dernier identifiant de location de cette vidéo + 1.&lt;br /&gt;Ainsi, si la vidéo dont l'upc est 123 est louée pour la première fois, le nom du FileSet dans Silverlight Streaming sera 123_0. Pour la seconde location de cette vidéo, ce sera 123_1. Ainsi de suite. Ainsi, on assure que tout nos FileSets aient des noms différents.&lt;br /&gt;&lt;br /&gt;Une fois cet identifiant trouvé, nous effectuons l'ajout en base de données de notre nouvelle location. Ensuite, nous lançons la copie de la vidéo d'origine (toujours cachée à l'utilisateur par sécurité) vers le nouveau FileSet. Cette copie s'effectue en REST (voir lab précédent).&lt;br /&gt;&lt;br /&gt;Enfin, le service retourne l'URL de la vidéo accessible à l'utilisateur (donc "http" et pas "https").&lt;br /&gt;&lt;br /&gt;Notre service de copie est ici terminé.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;WorkerRole&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Le WorkerRole est désigné pour un traitement constant, isolé du reste du système. En l'occurence, il s'agit de l'évaluation de validité de nos locations.&lt;br /&gt;Le WorkerRole possède donc une référence vers le service SOAP de SQL Server Data Services. La chose déroutante dans l'utilisation que l'on en fait est que l'on ne l'instancie pas. On possède juste cette référence comme un point de sortie vers SSDS. Cela, dans le but d'éviter de dupliquer le code. Pour ce faire on intègre aussi une référence vers notre WebRole, afin de bénéficier des classes de gestion de notre base de données et de Silverlight Streaming. Si l'on ne rajoute pas notre référence de SSDS dans le WorkerRole (en imaginant qu'on bénéficiera de celle du WebRole), alors le Proxy ne parvient pas à récupérer les informations nécessaires à son instanciation.&lt;br /&gt;&lt;br /&gt;Au niveau de la vérification de validité, nous récupérons toutes nos locations, chaque minute. Nous vérifions celles qui sont encore valides (dont le champs "duree_valid" &gt; 0). Nous décrémentons 60 (le nombre de secondes expirées) ou mettons ce champs à 0 (si le champs &lt;&gt;&lt;br /&gt;Au final, ce service manipule SQL Server Data Services en SOAP, Silverlight Streaming en REST, et offre une opération publiée en REST.&lt;br /&gt;L'ensemble est un peu complexe, mais tout à fait fonctionnel.&lt;br /&gt;&lt;br /&gt;Vous pouvez retrouver les sources au sein du projet disponible sur Sourceforge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-8422573374274890317?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/8422573374274890317/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=8422573374274890317' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/8422573374274890317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/8422573374274890317'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/01/service-azure-de-gestion-des-url.html' title='Service Azure de gestion des URL temporaires pour Silverlight Streaming'/><author><name>Léo Pratlong</name><uri>http://www.blogger.com/profile/06248885726738094783</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9jevx37O5Iw/SYOdJEect6I/AAAAAAAAAGU/0J36jYjut8o/s72-c/service_azure.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-3342922863189825613</id><published>2009-01-25T06:29:00.000-08:00</published><updated>2009-01-26T02:59:01.213-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='authority'/><category scheme='http://www.blogger.com/atom/ns#' term='entity'/><category scheme='http://www.blogger.com/atom/ns#' term='Web service'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='sds'/><category scheme='http://www.blogger.com/atom/ns#' term='container'/><category scheme='http://www.blogger.com/atom/ns#' term='sql data services'/><title type='text'>SQL Data Services</title><content type='html'>A travers ce lab, vous allez pouvoir utiliser une base de données dans les nuages (SDS) et récupérer les données pour les afficher dans votre page web.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Dans SDS :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tout d'abord, commençons par créer votre base de données.&lt;br /&gt;Connectez vous à l'adresse suivante : &lt;a href="https://onlinedemo.cerebrata.com/omega.sdsclient/current/default.aspx"&gt;lien&lt;/a&gt; pour administrer vodre sds en ligne. Login et mot de passes sont ceux de votre solution Azure.&lt;br /&gt;&lt;br /&gt;A savoir 3 notions essentielles dans SDS :&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Authority &lt;/span&gt;: il représente le nom de votre base de données&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Container &lt;/span&gt;: il représente une table&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Entity &lt;/span&gt;: C'est une ligne que l'on peut retrouver dans tout SGBD comprenant divers attributs. Une chose essentielles dans SDS vient du fait que dans chaque Container, on peut inserer différentes entity, j'entends pas là que chaque entity peut avoir des attributs différents.&lt;br /&gt;&lt;br /&gt;Sélectionnez votre "authority" et ajouter lui un container.&lt;br /&gt;Dans notre exemple, nous allons créer un container "video"&lt;br /&gt;&lt;br /&gt;Dans ce container video, nous allons lui ajouter uen entity :&lt;br /&gt;-titre (string) : "mon titre"&lt;br /&gt;-url (string) : "monURL"&lt;br /&gt;-description (string) : "maDescription"&lt;br /&gt;-format (string) : "monFormat"&lt;br /&gt;-duree (decimal) : "maDuree"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Dans notre Web Site :&lt;/span&gt;&lt;br /&gt;1) Créer un projet "web site" sous Visual Studio&lt;br /&gt;2) Modifiez le fichier "web.config" et ajouter les lignes suivantes, en donnant le nom de votre "authority", et login et mot de passe de votre solution&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XFvwMD4K-lA/SXyDoFbsZ7I/AAAAAAAAAA8/0MgY9tIltOs/s1600-h/appconfig.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 94px;" src="http://3.bp.blogspot.com/_XFvwMD4K-lA/SXyDoFbsZ7I/AAAAAAAAAA8/0MgY9tIltOs/s400/appconfig.png" alt="" id="BLOGGER_PHOTO_ID_5295251986557200306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3) Créer un client SOAP dans une classe SOAPMethod.cs&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XFvwMD4K-lA/SXyJliKJeeI/AAAAAAAAABU/-n64UvF_mO4/s1600-h/sitka.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 202px;" src="http://2.bp.blogspot.com/_XFvwMD4K-lA/SXyJliKJeeI/AAAAAAAAABU/-n64UvF_mO4/s400/sitka.png" alt="" id="BLOGGER_PHOTO_ID_5295258539798395362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4) Créer votre classe "video"&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XFvwMD4K-lA/SXyKyY0l5wI/AAAAAAAAABk/Zu30CEAGofE/s1600-h/videos.png"&gt;&lt;img style="cursor: pointer; width: 332px; height: 312px;" src="http://1.bp.blogspot.com/_XFvwMD4K-lA/SXyKyY0l5wI/AAAAAAAAABk/Zu30CEAGofE/s400/videos.png" alt="" id="BLOGGER_PHOTO_ID_5295259860141991682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5) Ajouter la méthode pour récupérer vos vidéos&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XFvwMD4K-lA/SXyKTSx_HYI/AAAAAAAAABc/jSkk73H2sUE/s1600-h/getsoap.png"&gt;&lt;img style="cursor: pointer; width: 345px; height: 400px;" src="http://3.bp.blogspot.com/_XFvwMD4K-lA/SXyKTSx_HYI/AAAAAAAAABc/jSkk73H2sUE/s400/getsoap.png" alt="" id="BLOGGER_PHOTO_ID_5295259325944503682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6) Récupérer vos vidéos du coté behind et les afficher dans un listview&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XFvwMD4K-lA/SXyIoN1FoWI/AAAAAAAAABM/6bfn9z8h5uE/s1600-h/loadcs.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 92px;" src="http://4.bp.blogspot.com/_XFvwMD4K-lA/SXyIoN1FoWI/AAAAAAAAABM/6bfn9z8h5uE/s400/loadcs.png" alt="" id="BLOGGER_PHOTO_ID_5295257486369333602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;7) Afficher le résultat dans votre page .aspx&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XFvwMD4K-lA/SXyHyO8-WnI/AAAAAAAAABE/HwVI7CoqYFo/s1600-h/videosaspx.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 181px;" src="http://1.bp.blogspot.com/_XFvwMD4K-lA/SXyHyO8-WnI/AAAAAAAAABE/HwVI7CoqYFo/s400/videosaspx.png" alt="" id="BLOGGER_PHOTO_ID_5295256558957910642" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-3342922863189825613?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/3342922863189825613/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=3342922863189825613' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/3342922863189825613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/3342922863189825613'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/01/sql-data-services.html' title='SQL Data Services'/><author><name>Sébastien SAPET</name><uri>http://www.blogger.com/profile/06950722356488746362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_XFvwMD4K-lA/SXyDoFbsZ7I/AAAAAAAAAA8/0MgY9tIltOs/s72-c/appconfig.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-3836655868986174669</id><published>2009-01-22T14:17:00.000-08:00</published><updated>2009-01-29T08:08:27.573-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web service'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='copy'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight Streaming'/><category scheme='http://www.blogger.com/atom/ns#' term='azure'/><category scheme='http://www.blogger.com/atom/ns#' term='Web role'/><category scheme='http://www.blogger.com/atom/ns#' term='WCF'/><title type='text'>Web Service sur Azure + accès REST à Silverlight Streaming</title><content type='html'>Je vais vous montrer à travers ce lab comment construire un service pour Azure permettant d'effectuer des copies sur SLS (Silverlight Streaming Service). Nous attaquons Silverlight Streaming à l'aide de la méthode COPY du protocole REST. Le COPY va effectuer la copie du Fileset spécifié (sur la plateforme Silverlight Streaming, une vidéo est nommée "video.wmv" et est identifiée à l'aide du nom de son FileSet).&lt;br /&gt;Tout d'abord, créons un projet "Web Cloud Service" sous Visual Studio 9 (contenant toutes les libs nécessaires, indiquées dans un lab précédent).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;WebRole&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le WebRole est une application web contenant une page default.aspx.&lt;br /&gt;Ajoutons un nouvel élément à ce projet : "Add -&gt; New Item". Choisissez WCF Service.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Edition : Après avoir rencontré des problèmes pour interroger le service hébergé sur Azure et exposé en SOAP, il semble que la seule manière de publier ce service dans le "Cloud" est de l'exposer en REST. Les indications suivantes ont donc été modifiées afin de le rendre fonctionnel sur la plateforme de Microsoft.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Merci à &lt;strong&gt;Ronny Kwon&lt;/strong&gt; ( &lt;a href="http://www.bloginthecloud.com/"&gt;bloginthecloud &lt;/a&gt;) et &lt;strong&gt;Florient Gutierrez&lt;/strong&gt; ( &lt;a href="http://epsicloudcomputing.wordpress.com/"&gt;projet Kumoe &lt;/a&gt;) pour leur précieuse aide !&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Modifions le "endpoint" décrit dans le fichier Web.config. Vous devez changer le champs "binding". A la place de "wsHttpBinding", nous utilisons "webHttpBinding".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_9jevx37O5Iw/SYHPisLx5gI/AAAAAAAAAF8/y1q2b77nUcI/s1600-h/xml_web.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5296742831647483394" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 77px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_9jevx37O5Iw/SYHPisLx5gI/AAAAAAAAAF8/y1q2b77nUcI/s400/xml_web.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Dans l'interface générée (nommée ici ICopieVideo.cs), ajoutez le prototype de votre opération &lt;em&gt;ainsi que les instructions permettant l'accès en REST &lt;/em&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;br /&gt;[&lt;span style="COLOR: rgb(0,204,204)"&gt;OperationContract&lt;/span&gt;()]&lt;br /&gt;[&lt;span style="color:#00cccc;"&gt;WebGet&lt;/span&gt;(UriTemplate = &lt;span style="color:#ff0000;"&gt;"doCopy/{upc}/"&lt;/span&gt;, RequestFormat= &lt;span style="color:#00cccc;"&gt;WebMessageFormat&lt;/span&gt;.Xml, ResponseFormat= &lt;span style="color:#00cccc;"&gt;WebMessageFormat&lt;/span&gt;.Xml, BodyStyle= &lt;span style="color:#00cccc;"&gt;WebMessageBodyStyle&lt;/span&gt;.Bare)]&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,153)"&gt;string&lt;/span&gt; doCopy(&lt;span style="COLOR: rgb(0,0,153)"&gt;string&lt;/span&gt; upc);&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;Il faut maintenant ajouter une référence vers System.ServiceModel.Web (clique droit sur la solution -&gt; Add reference). Ajouter cette référence dans l'interface : &lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="color:#000099;"&gt;using&lt;/span&gt; &lt;span style="color:#000000;"&gt;System.ServiceModel.Web&lt;/span&gt;;&lt;/blockquote&gt;&lt;p&gt;&lt;em&gt;Enfin, il faut indiquer une factory dans CopieVideo.svc (clique droit -&gt; View Markup) :&lt;/em&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/em&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;Factory&lt;/span&gt;=&lt;span style="color:#000099;"&gt;"System.ServiceModel.Activation.WebServiceHostFactory"&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;em&gt;&lt;span style="color:#ff0000;"&gt;&lt;p&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;Maintenant, implémentons notre interface dans CopieVideo.svc.cs. Nous aurons besoin d'autres méthodes. Par exemple getAuth() nous permet d'authentifier notre connexion à SLS. Voici à quoi elle ressemble (ainsi que la déclaration de nos variables globales) :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_9jevx37O5Iw/SXjXkrH3ihI/AAAAAAAAAEM/az9jjLmVe1M/s1600-h/getauth.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294218387025005074" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; HEIGHT: 241px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_9jevx37O5Iw/SXjXkrH3ihI/AAAAAAAAAEM/az9jjLmVe1M/s400/getauth.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Une fois les crédentials créés, nous pouvons effectuer notre requête REST vers Silverlight Streaming Service. Pour cela, implémentons la méthode doCopy(string upc) :&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_9jevx37O5Iw/SXjZe7RJEHI/AAAAAAAAAEU/Dw-hk5125Nc/s1600-h/docopy.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294220487302910066" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; HEIGHT: 241px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_9jevx37O5Iw/SXjZe7RJEHI/AAAAAAAAAEU/Dw-hk5125Nc/s400/docopy.jpg" border="0" /&gt;&lt;/a&gt; &lt;strong&gt;A noter : &lt;/strong&gt;&lt;em&gt;il semblerait qu'il ne soit pas possible d'effectuer une copie d'un fileset avec un filesetName ayant déjà existé (si le fileset est issu d'un upload et d'un delete depuis l'interface d'administration web). Le headers["Destination"] doit donc contenir une adresse unique à chaque requête dans le cas où nos ajouts se font depuis l'interface web. Il faut donc le gérer en fonction de vos données (dans le cas de notre projet, avec les SQL Data Services lorsqu'ils seront liés à ce service de copie).&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Notre service REST est prêt.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Consommation de test (Pour accéder au service exposé en local en SOAP)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;em&gt;(Exemple réalisé avant les dernières modifications : vous pouvez l'utiliser pour vos tests vers un service SOAP et non REST)&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Créez un projet Application Console dans votre solution. Ajoutez une référence de service. Cliquez sur Discover. Là, l'environnement détècte les services de votre solution. Sélectionnez donc le service CopieVideo.svc .&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Maintenant, implémentons le code de notre application :&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="COLOR: rgb(102,204,204)"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR: rgb(102,0,0)"&gt;"Upc à copier :"&lt;/span&gt;);&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,153)"&gt;string&lt;/span&gt; upc = &lt;span style="COLOR: rgb(102,204,204)"&gt;Console&lt;/span&gt;.ReadLine();&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,153)"&gt;var&lt;/span&gt; client = &lt;span style="COLOR: rgb(0,0,153)"&gt;new&lt;/span&gt; ServiceCopieLocal.&lt;span style="COLOR: rgb(102,204,204)"&gt;CopieVideoClient&lt;/span&gt;();&lt;br /&gt;&lt;span style="COLOR: rgb(102,204,204)"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR: rgb(102,0,0)"&gt;"résultat : "&lt;/span&gt; + client.doCopy(upc));&lt;br /&gt;&lt;span style="COLOR: rgb(102,204,204)"&gt;Console&lt;/span&gt;.ReadLine();&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;Exécutez cette application. Renseignez le nom du Fileset à copier. Le service effectue le traitement et vous renvoie la réponse :&lt;/p&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_9jevx37O5Iw/SXpy3aILyTI/AAAAAAAAAFk/KJPPkyZsH2I/s1600-h/copie.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294670608159459634" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; HEIGHT: 201px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_9jevx37O5Iw/SXpy3aILyTI/AAAAAAAAAFk/KJPPkyZsH2I/s400/copie.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Publication du service REST&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Maintenant que notre solution Web Cloud Service contenant le WCF service est prête, nous pouvons la publier. Pour cela, faîtes un clique droit sur le projet -&gt; "Publish". Cette opération nous crée deux fichiers dans le répertoire "/bin/publish/". &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Package : *.cspkg&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Configuration : *.cscfg&lt;/li&gt;&lt;/ul&gt;La page &lt;a href="https://lx.azure.microsoft.com/Cloud/Provisioning/Default.aspx"&gt;https://lx.azure.microsoft.com/Cloud/Provisioning/Default.aspx&lt;/a&gt; devrait alors s'ouvrir. Créez un nouveau projet, et choisissez "Hosted Project" (nécessite une code d'invitation). Suivez les instructions et uploadez vos deux fichiers sur Azure.&lt;br /&gt;&lt;p&gt;Une fois hébergé, transitez votre projet depuis le mode Staging vers le mode Production (afin de lier votre projet à une URL fixe et unique).&lt;br /&gt;L'installation du service est terminée. Vous devriez pouvoir y accéder à l'adresse de votre projet azure.&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Pour tester votre service REST, vous pouvez contacter l'URL de votre service avec les paramètres nécessaires. Par exemple, pour ce projet :&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;a href="http://3.bp.blogspot.com/_9jevx37O5Iw/SYHTIW9Wb9I/AAAAAAAAAGE/qXSgfC-Lh_A/s1600-h/rest_reponse.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5296746777319731154" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 300px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_9jevx37O5Iw/SYHTIW9Wb9I/AAAAAAAAAGE/qXSgfC-Lh_A/s400/rest_reponse.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;em&gt;Le service nous renvoie le XML contenant l'URL de la vidéo copiée sur Silverlight Streaming.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Le code de ce lab est bien entendu disponible sur Sourceforge.&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-3836655868986174669?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/3836655868986174669/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=3836655868986174669' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/3836655868986174669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/3836655868986174669'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/01/web-service-sur-azure-pour-effectuer.html' title='Web Service sur Azure + accès REST à Silverlight Streaming'/><author><name>Léo Pratlong</name><uri>http://www.blogger.com/profile/06248885726738094783</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9jevx37O5Iw/SYHPisLx5gI/AAAAAAAAAF8/y1q2b77nUcI/s72-c/xml_web.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-664073094528087391</id><published>2009-01-10T02:08:00.000-08:00</published><updated>2009-01-10T04:25:26.533-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight Streaming API'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight Streaming Service'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight Streaming'/><category scheme='http://www.blogger.com/atom/ns#' term='SLS'/><category scheme='http://www.blogger.com/atom/ns#' term='RestLet'/><title type='text'>Utiliser l'API Silverlight Streaming avec RestLet</title><content type='html'>&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Silverlight Streaming (SLS pour Silverlight Streaming Service) est un service offert par Microsoft, permettant de diffuser des vidéos et des applications Silverlight 2 sur Internet.&lt;br /&gt;On peut déposer ses fichiers sur le serveur de SLS :&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;manuellement, par l'interface web proposée par Microsoft,&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;logiciellement, en utilisant l'API basée sur REST et documentée &lt;/span&gt;&lt;a href="http://msdn.microsoft.com/fr-fr/library/bb851616%28en-us%29.aspx"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;ici&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Dans le cadre de notre solution de vidéo à la demande, nous souhaitons utiliser SLS pour le stockage et la diffusion des vidéos qui seront disponibles sur le site. L'alimentation de se catalogue de vidéo est réalisée par l'ensemble des vidéo clubs partenaires, qui possèdent un logiciel d'administration commun utilisant des technologies Java.&lt;br /&gt;&lt;br /&gt;Notre but est donc d'utiliser l'API de Silverlight Streaming Service dans ce logiciel d'administration en Java, pour déposer automatiquement les nouvelles vidéos sur le serveur SLS de notre site de VOD.&lt;br /&gt;&lt;br /&gt;Pour y parvenir nous utiliserons le framework &lt;/span&gt;&lt;a href="http://www.restlet.org/"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;RestLet&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, pour gérer ce type d'architecture dans notre logiciel Java.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Préparation du projet&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;Nous utilisons NetBeans pour ce lab mais n'importe quel IDE Java fonctionnerait aussi bien ici.&lt;br /&gt;&lt;br /&gt;Créer tout d'abord un projet Java standard ou une librairie de classes Java en fonction de votre besoin.&lt;br /&gt;Téléchargez le framework RestLet et ajoutez ses librairies au projet.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p5I-Wnbo0wE/SWiA04nY0wI/AAAAAAAAAI8/FfS7NRZ2jgQ/s1600-h/addLib.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 302px; height: 199px;" src="http://2.bp.blogspot.com/_p5I-Wnbo0wE/SWiA04nY0wI/AAAAAAAAAI8/FfS7NRZ2jgQ/s400/addLib.png" alt="" id="BLOGGER_PHOTO_ID_5289619408385790722" border="0" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Initialisation des paramètres de connection&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:180%;"&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Plusieurs paramètres doivent être réglés avant d'initialiser une communication vers une architecture REST au moyen de RestLet :&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Le type de protocole utilisé (ici HTTPS)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;L'URI du service à contacter&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Les identifiants, éventuellement nécessaires auprès du service contacté&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Voici donc les paramètres que nous avons utilisé ici :&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;private final static&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; String &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;SILVERLIGHT_STREAMING_SERVICE_ROOT&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; = &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;"https://silverlight.services.live.com/"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;private final static&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; String &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;SILVERLIGHT_STREAMING_ID&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; = &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;"87996"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;private static&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; String &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;SILVERLIGHT_STREAMING_ACCESS_KEY&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;private&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; Client &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;m_RestletClient&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;;&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;br /&gt;Nous initialisons tout d'abord le protocole de communication :&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;m_RestletClient&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; = &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; Client(Protocol.&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;HTTPS&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;);&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Puis nous lisons les paramètres d'identification dans un fichier séparé :&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;private void &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;readCredentialsFromPropertiesFile() &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;throws&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; IOException {&lt;br /&gt;Properties SLSProperties = &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; Properties();&lt;br /&gt;FileInputStream propertiesFile = &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; FileInputStream(&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;"../Ressources/credentials.txt"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;);&lt;br /&gt;SLSProperties.load(propertiesFile);&lt;br /&gt;propertiesFile.close();&lt;br /&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;SILVERLIGHT_STREAMING_ACCESS_KEY&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; = SLSProperties.getProperty(&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;"SLS_Access_Key"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;);&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Les paramètres étants réglés, nous allons pouvoir commencer à envoyer des requêtes à notre serveur SLS.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Création du "file set"&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;SLS peut recevoir à la fois des applications Silverlight 2 et des vidéos, c'est pourquoi la notion de file set a été choisie. Un file set est un répertoire sur notre compte SLS, pouvant contenir tous les fichiers d'une application Silverlight 2 ou une vidéo à diffuser.&lt;br /&gt;&lt;br /&gt;Pour ajouter notre vidéo nous allons tout d'abord créer un répertoire vide (notre file set) et ensuite lui ajouter la vidéo.&lt;br /&gt;&lt;br /&gt;Création du file set :&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;private void&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; createFileSetForNewVideo() {&lt;br /&gt;String fileSetName = &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;"Nom_de_ma_video"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;;&lt;br /&gt;String serviceUri = &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;SILVERLIGHT_STREAMING_SERVICE_ROOT&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; + &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;"/"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; + &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;SILVERLIGHT_STREAMING_ID&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; + &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;"/"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; + fileSetName;&lt;br /&gt;Request request = &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; Request(Method.&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;MKCOL&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;, serviceUri);&lt;br /&gt;&lt;br /&gt;loadCredentialsForRequest(request);&lt;br /&gt;&lt;br /&gt;Response response = m_RestletClient.handle(request);&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;br /&gt;Apres avoir choisi un nom pour le répertoire, on définit l'URI du service et on utilise la méthode d'envoi MKCOL (abréviation de Make Collection) pour créer un nouveau fileset.&lt;br /&gt;&lt;br /&gt;L'appel &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;loadCredentialsForRequest(request) &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;va permettre d'ajouter les information d'identifications de lutilisateur auprès du serveur. Voici son contenu :&lt;br /&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;private void&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; loadCredentialsForRequest(Request request) {&lt;br /&gt;ChallengeScheme scheme = ChallengeScheme.&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;HTTP_BASIC&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;;&lt;br /&gt;ChallengeResponse authentication = &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; ChallengeResponse(scheme,&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;SILVERLIGHT_STREAMING_ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;SILVERLIGHT_STREAMING_ACCESS_KEY&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;);&lt;br /&gt;request.setChallengeResponse(authentication);&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;br /&gt;Après avoir ajouté ces informations, on va lancer la requete en l'associant à l'objet client. La réponse pourra être récupérée pour vérifier que tout s'est bien déroulé.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Envoi du fichier vidéo&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Enfin, nous envoyons le fichier vidéo dans le répertoire nouvellement créé.&lt;br /&gt;&lt;br /&gt;La méthode est très proche de la précédente puisque on ne change que la méthode d'envoi qui devient du PUT et qu'on ajoute le fichier vidéo lui-même à la requête.&lt;br /&gt;L'ajout du fichier à la requête se passe de cette façon :&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;FileRepresentation fileRepresentation = &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; FileRepresentation(&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;m_UploadedFile&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, MediaType.&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;VIDEO_WMV&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, 0);&lt;br /&gt;EncodeRepresentation encodedFileRep = &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; EncodeRepresentation(Encoding.&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;ALL&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;, fileRepresentation);&lt;br /&gt;request.setEntity(encodedFileRep);&lt;/span&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Ces requêtes peuvent durer un certain temps (surtout l'envoi du fichier vidéo) donc n'oubliez pas d'utiliser un Thread séparé pour effectuer ces appels d'entrées/sorties.&lt;br /&gt;&lt;br /&gt;Le résultat :&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p5I-Wnbo0wE/SWiQijCYDtI/AAAAAAAAAJE/BDZ7cG3wJcY/s1600-h/ListeVideos.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 273px;" src="http://1.bp.blogspot.com/_p5I-Wnbo0wE/SWiQijCYDtI/AAAAAAAAAJE/BDZ7cG3wJcY/s400/ListeVideos.png" alt="" id="BLOGGER_PHOTO_ID_5289636685541805778" border="0" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;La vidéo est bien disponible et visible dans l'interface web de votre compte Silverlight Streaming Service.&lt;br /&gt;&lt;br /&gt;L'ensemble du code est disponible sur SourceForge à l'adresse :&lt;br /&gt;&lt;/span&gt;&lt;a href="http://clouditup.svn.sourceforge.net/viewvc/clouditup/Projet/Backoffice%20Java/SilverlightStreamingHandlerLibrary/"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;http://clouditup.svn.sourceforge.net/viewvc/clouditup/Projet/Backoffice%20Java/SilverlightStreamingHandlerLibrary/&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;br /&gt;La prochaine étape consistera à notifier notre site de VOD, ainsi que ceux de nos partenaires, de la disponibilité de cette vidéo.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-664073094528087391?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/664073094528087391/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=664073094528087391' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/664073094528087391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/664073094528087391'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/01/utiliser-lapi-silverlight-streaming.html' title='Utiliser l&apos;API Silverlight Streaming avec RestLet'/><author><name>Maxime Britto</name><uri>http://www.blogger.com/profile/12048362267455309200</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_p5I-Wnbo0wE/SWiA04nY0wI/AAAAAAAAAI8/FfS7NRZ2jgQ/s72-c/addLib.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-1182624826221642185</id><published>2009-01-06T08:54:00.000-08:00</published><updated>2009-01-06T09:56:36.054-08:00</updated><title type='text'>Interopérabilité entre équipes</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;L'un des avantages de l'interopérabilité entre les technologies est de faciliter les échanges entre les partenaires, encore faut-il s'entendre sur le contenu de chaque message échangé.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En effet, si l'interopérabilité nous garanti que l'on peut envoyer et recevoir des messages avec des technologies différentes, il nous faut pouvoir traiter le contenu du message pour que celui-ci présente un intérêt. Ce principe donne lieu à la publication de documentations, chez tous les acteurs offrant des web services, permettant de d'envoyer des messages compréhensibles et de pouvoir interpréter les réponses.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dans le cadre de notre projet, nous devons gérer une solution de partenariat avec d'autres sites de VOD (Blog in the cloud et Projet Kumoe). L'idée est que chaque magasin de possédant des vidéos va les proposer aux sites de VOD. &lt;/div&gt;&lt;div&gt;Cette proposition se fera sous la forme d'une description de la vidéo et d'un tarif de location envoyés sous forme d'un message asynchrone aux partenaires. Les partenaires auront une file de message à traiter et déciderons alors s'il souhaitent récupérer le fichier vidéo dans leur plateforme de streaming, au prix proposé.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;L'enjeu est maintenant de s'entendre sur les informations contenues dans ce message et sur le nom des balises XML le décrivant.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voici notre première proposition&lt;/div&gt;&lt;div&gt;, envoyée aux responsables des autres sites de VOD :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 313px;" src="http://2.bp.blogspot.com/_p5I-Wnbo0wE/SWObNotSy_I/AAAAAAAAAI0/SWZRYjyGARs/s400/message+XML.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5288241046031092722" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La quantité d'information est minimale et nous permettrait de développer la solution rapidement dans un premier temps. On pourrait bien évidemment ajouter toutes les informations habituelles relatives à un film (auteur, réalisateur, acteurs, etc.) mais notre but est principalement lié à l'interopérabilité et non à l'exhaustivité.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Lorsque les débats entres responsables de sites de VOD seront terminés, nous afficherons la documentation finale de ces messages dans ce blog.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-1182624826221642185?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/1182624826221642185/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=1182624826221642185' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/1182624826221642185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/1182624826221642185'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/01/interoprabilit-entre-quipes.html' title='Interopérabilité entre équipes'/><author><name>Maxime Britto</name><uri>http://www.blogger.com/profile/12048362267455309200</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_p5I-Wnbo0wE/SWObNotSy_I/AAAAAAAAAI0/SWZRYjyGARs/s72-c/message+XML.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-3754495308094455676</id><published>2009-01-02T14:27:00.000-08:00</published><updated>2009-01-12T04:49:25.375-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='live id'/><category scheme='http://www.blogger.com/atom/ns#' term='authentification'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='azure'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Lab 4 : To be or not to be...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9jevx37O5Iw/SWAfqmm57RI/AAAAAAAAADU/MW5mbjZSfjs/s1600-h/liveloginlogo.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 121px; height: 125px;" src="http://2.bp.blogspot.com/_9jevx37O5Iw/SWAfqmm57RI/AAAAAAAAADU/MW5mbjZSfjs/s400/liveloginlogo.gif" alt="" id="BLOGGER_PHOTO_ID_5287260779311656210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ce lab est consacré à la mise en place d'une authentification live ID pour des applications web .Net et Java.&lt;br /&gt;Je m'efforcerai de décrire les points importants nécessaires à la mise en place de cette identification.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A noter : &lt;/span&gt;&lt;span style="font-style: italic;"&gt;vous pouvez télécharger les SDK  et les exemples pour Windows Live ID à l'adresse suivante : &lt;span style="color: rgb(0, 0, 153);"&gt;&lt;a href="http://dev.live.com/liveid"&gt;http://dev.live.com/liveid&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Live ID pour .Net&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tout d'abord, il faut paramétrer le fichier Web.xml de votre application. Celui ci doit contenir les informations d'identification de votre application auprès des services Live. Pour enregistrer votre application, rendez-vous sur le portail de Azure &lt;a href="https://lx.azure.microsoft.com/Cloud/Provisioning/Default.aspx"&gt;https://lx.azure.microsoft.com/Cloud/Provisioning/Default.aspx&lt;/a&gt;, en utilisant vos propres identifiants live ID. Vous saisirez alors le nom de votre application, une description de celle-ci, ainsi que l'adresse de retour vers laquelle Windows Live renverra le Token (dans mes essais, il s'agit de http://localhost:1805/webauth-handler.aspx ).&lt;br /&gt;Voici à quoi ressemble le fichier &lt;span style="font-style: italic;"&gt;Web.xml&lt;/span&gt; :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9jevx37O5Iw/SV6Zl7pdBqI/AAAAAAAAACM/-qPOD6fnGmM/s1600-h/webxml.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 344px; height: 83px;" src="http://1.bp.blogspot.com/_9jevx37O5Iw/SV6Zl7pdBqI/AAAAAAAAACM/-qPOD6fnGmM/s400/webxml.jpg" alt="" id="BLOGGER_PHOTO_ID_5286831889525311138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;wll_appid&lt;/span&gt; correspond à l'identifiant de votre application (donné lors de l'enregistrement). &lt;span style="font-style: italic;"&gt;wll_secret&lt;/span&gt; correspond à la clé secrète de votre application. Il ne faut donc pas que ce fichier soit accessible depuis l'extérieur.&lt;br /&gt;&lt;br /&gt;Dans votre fichier &lt;span style="font-style: italic;"&gt;default.aspx&lt;/span&gt;, ajouter les lignes suivantes :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9jevx37O5Iw/SV6eZt9jvjI/AAAAAAAAACk/jDOMRIsY0v8/s1600-h/liveid.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 348px; height: 135px;" src="http://2.bp.blogspot.com/_9jevx37O5Iw/SV6eZt9jvjI/AAAAAAAAACk/jDOMRIsY0v8/s400/liveid.jpg" alt="" id="BLOGGER_PHOTO_ID_5286837177251249714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ces lignes affichent un lien permettant de se connecter ou se déconnecter de Windows Live, en contactant l'URL indiqué ci-dessous :&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;src="http://login.live.com/controls/WebAuth.htm?appid=&lt;%=AppId%&gt;&amp;amp;style=font-size%3A+10pt%3B+font-family%3A+verdana%3B+background%3A+white%3B"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Comment récupère-t-on le Token (jeton d'identification) ?&lt;br /&gt;A l'aide de la classe &lt;span style="font-style: italic;"&gt;WindowsLiveLogin&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;qui reçoit le token depuis la page d'identification Live ID et l'enregistre dans le cache du navigateur à l'aide d'un Cookie. Live ID renvoie ce token à l'aide d'une requête HTTP, à l'aide du protocole REST.&lt;br /&gt;Voyons de plus près dans le fichier de retour &lt;span style="font-style: italic;"&gt;webauth-handler.aspx.cs &lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;WindowsLiveLogin.User user = wll.ProcessLogin(req.Form);&lt;br /&gt;HttpCookie loginCookie = new HttpCookie(LoginCookie);&lt;br /&gt;&lt;br /&gt;La classe &lt;span style="font-style: italic;"&gt;WindowsLiveLogin&lt;/span&gt; effectue le traitement du login :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:blue;"    lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:blue;"    lang="EN-US"&gt;public&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;User&lt;/span&gt; ProcessLogin(&lt;span style="color: rgb(43, 145, 175);"&gt;NameValueCollection&lt;/span&gt; query)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; action = query[&lt;span style="color: rgb(163, 21, 21);"&gt;"action"&lt;/span&gt;];&lt;o:p&gt;&lt;/o:p&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; token = query[&lt;span style="color: rgb(163, 21, 21);"&gt;"stoken"&lt;/span&gt;];&lt;o:p&gt;&lt;/o:p&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; context = query[&lt;span style="color: rgb(163, 21, 21);"&gt;"appctx"&lt;/span&gt;];&lt;o:p&gt;&lt;/o:p&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (context != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;context = &lt;span style="color: rgb(43, 145, 175);"&gt;HttpUtility&lt;/span&gt;.UrlDecode(context);&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; ProcessToken(token, context);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;font-size:10;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;font-size:10;"  &gt;}&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;font-size:10;"  &gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;La méthode  &lt;span style="font-style: italic;"&gt;ProcessToken &lt;/span&gt;nous permet d'obtenir une version lisible du token, en le parsant et en découpant les champs qui nous sont utiles.&lt;br /&gt;&lt;br /&gt;Enfin, pour identifier automatiquement un utilisateur déjà authentifié auprès de live ID, il suffit de rechercher dans ses Cookies la présence de notre token (dans le fichier &lt;span style="font-style: italic;"&gt;Default.aspx.cs&lt;/span&gt;) :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="Section1"&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;HttpRequest&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt; req = &lt;span style="color: rgb(43, 145, 175);"&gt;HttpContext&lt;/span&gt;.Current.Request;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;HttpCookie&lt;/span&gt; loginCookie = req.Cookies[LoginCookie];&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (loginCookie != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;&lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; token = loginCookie.Value;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;            &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (!&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(token))&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;            &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;                &lt;/span&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;WindowsLiveLogin&lt;/span&gt;.&lt;span style="color: rgb(43, 145, 175);"&gt;User&lt;/span&gt; user = wll.ProcessToken(token);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;                &lt;/span&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (user != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;                &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;                    &lt;/span&gt;UserId = user.Id;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;span style=""&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-bottom: 0.0001pt; line-height: normal;"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;            &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;font-size:10;"  &gt;&lt;span style=""&gt;        &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="MsoNormal"&gt;&lt;span style="line-height: 115%;font-family:&amp;quot;;font-size:10;"  &gt;&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Il est donc très facile de mettre en place une authentification Live ID pour notre application web .Net, d'autant plus que la documentation disponible sur internet est très précise.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Live ID pour Java&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;De la même manière que nous avons enregistré notre application .Net auprès des services Windows Live, il faut enregistrer cette application et configurer le fichier &lt;span style="font-style: italic;"&gt;Application-Key.xml&lt;/span&gt; :&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9jevx37O5Iw/SV7IZv_07DI/AAAAAAAAACs/Hk5f11oZm8s/s1600-h/liveidjava.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 346px; height: 81px;" src="http://3.bp.blogspot.com/_9jevx37O5Iw/SV7IZv_07DI/AAAAAAAAACs/Hk5f11oZm8s/s400/liveidjava.jpg" alt="" id="BLOGGER_PHOTO_ID_5286883357286001714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ceci est le fichier fourni dans l'exemple disponible avec le SDK.&lt;br /&gt;&lt;br /&gt;Dans le fichier &lt;span style="font-style: italic;"&gt;index.jsp&lt;/span&gt;, il faut initialisé le module Windows Live Login. Comme pour la version .Net, cette classe s'occupera de traiter la requête en provenance du site Live ID, afin d'obtenir notre jeton :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// Initialisation de WLL avec KEYFILE correspondant au fichier Application-Key.xml&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// (configuré dans settings.jsp)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;WindowsLiveLogin &lt;/span&gt;wll = &lt;span style="color: rgb(0, 0, 153);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;WindowsLiveLogin&lt;/span&gt;(&lt;span style="color: rgb(204, 102, 0);"&gt;KEYFILE&lt;/span&gt;);&lt;br /&gt;wll.&lt;span style="color: rgb(51, 153, 153);"&gt;setDebug&lt;/span&gt;(DEBUG);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// Nous récupérons le champs AppID depuis Application-Key.xml&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;String &lt;/span&gt;appId = wll.getAppId();&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;String &lt;/span&gt;userid = &lt;span style="color: rgb(0, 0, 153);"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;String &lt;/span&gt;username = &lt;span style="color: rgb(0, 0, 153);"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// vérification de la présence du token dans le cache. S'il est présent, chargement du User ID&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;String &lt;/span&gt;token = (&lt;span style="color: rgb(0, 0, 153);"&gt;String&lt;/span&gt;) session.&lt;span style="color: rgb(51, 153, 153);"&gt;getAttribute&lt;/span&gt;(&lt;span style="color: rgb(204, 102, 0);"&gt;TOKEN&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;if &lt;/span&gt;(token &lt;span style="color: rgb(0, 0, 153);"&gt;!=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);"&gt;null&lt;/span&gt;) {&lt;br /&gt;&lt;span style="color: rgb(0, 204, 204);"&gt;WindowsLiveLogin&lt;/span&gt;.User user = wll.&lt;span style="color: rgb(51, 153, 153);"&gt;processToken&lt;/span&gt;(token);&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;br /&gt;if&lt;/span&gt; (user &lt;span style="color: rgb(0, 0, 153);"&gt;!=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 153);"&gt;null&lt;/span&gt;) {&lt;br /&gt;userid = user.&lt;span style="color: rgb(51, 153, 153);"&gt;getId&lt;/span&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// Ici, nous pouvons rechercher dans notre base de données le nom d'utilisateur&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// correspondant au UserID trouvé précédemment&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;L'accès au lien de connexion ou de déconnexion de live ID se fait par le même procédé qu'en .Net (étant donné qu'il s'agit de balises HTML).&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Résultat&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Dans les deux cas, nous obtenons la page suivante :&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9jevx37O5Iw/SV7QZ_n3GzI/AAAAAAAAAC0/q-4Yd6t6Gnc/s1600-h/liveidexemple.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 241px; height: 125px;" src="http://3.bp.blogspot.com/_9jevx37O5Iw/SV7QZ_n3GzI/AAAAAAAAAC0/q-4Yd6t6Gnc/s400/liveidexemple.jpg" alt="" id="BLOGGER_PHOTO_ID_5286892157573471026" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;span&gt;Dans la première fenêtre, on nous invite à nous connecter au travers d'un lien généré par Windows Live (l'url contenu dans l'iframe).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9jevx37O5Iw/SV7Rtj0PFpI/AAAAAAAAADE/dOs8caD0JZU/s1600-h/liveidexemple2.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 233px; height: 153px;" src="http://2.bp.blogspot.com/_9jevx37O5Iw/SV7Rtj0PFpI/AAAAAAAAADE/dOs8caD0JZU/s400/liveidexemple2.jpg" alt="" id="BLOGGER_PHOTO_ID_5286893593218193042" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Lorsqu'on se connecte, nous recevons un token nous permettant de connaître l'identifiant de l'utilisateur. Le texte contenu dans l'iframe affiche alors "sign out".&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.matsport-solutions.fr/site/images/tools.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 50px; height: 48px;" src="http://www.matsport-solutions.fr/site/images/tools.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;L'authentification Live ID apparaît donc comme un moyen efficace pour identifier nos utilisateurs sans pour autant mettre en place un système d'authentification qui nous est propre. De plus, cela accroît l'interopérabilité avec d'autres services, en fournissant ce moyen d'identification unique aux services Live, à nos services, et bien d'autres...&lt;br /&gt;&lt;br /&gt;Vous pouvez télécharger les sources de ce lab ainsi que de la version application lourde .Net &lt;a href="http://clouditup.svn.sourceforge.net/viewvc/clouditup/Labs/"&gt;ICI&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-3754495308094455676?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/3754495308094455676/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=3754495308094455676' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/3754495308094455676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/3754495308094455676'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/01/lab-4-to-be-or-not-to-be.html' title='Lab 4 : To be or not to be...'/><author><name>Léo Pratlong</name><uri>http://www.blogger.com/profile/06248885726738094783</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9jevx37O5Iw/SWAfqmm57RI/AAAAAAAAADU/MW5mbjZSfjs/s72-c/liveloginlogo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-2915227402630311901</id><published>2009-01-02T06:58:00.000-08:00</published><updated>2009-01-02T20:08:31.502-08:00</updated><title type='text'>Lab 3 : Je suis absent, veuillez laisser un message.</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_c-W3Vdh5Je4/SV4wpL4SkjI/AAAAAAAAAAc/AA2rroI5Ya4/s1600-h/banner_servicebus.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 178px; height: 56px;" src="http://3.bp.blogspot.com/_c-W3Vdh5Je4/SV4wpL4SkjI/AAAAAAAAAAc/AA2rroI5Ya4/s320/banner_servicebus.png" alt="" id="BLOGGER_PHOTO_ID_5286716496701198898" border="0" /&gt;&lt;/a&gt;Dans le cadre de notre projet nous souhaitons que des partenaires puissent nous communiquer leurs nouveautés afin de pouvoir les rendre disponibles à la consultation sur notre site de vod.&lt;br /&gt;&lt;br /&gt;Pour être accessible même lorsque notre serveur est hors ligne, nous avons décidé de mettre en place une file de messages. Pour ce faire, nous avons plusieurs solutions :&lt;ul&gt;&lt;li&gt;Une solution payante de type Amazon Simple Queue Service.&lt;/li&gt;&lt;li&gt;Une solution implémentant les .Net Services (à travers le service bus).&lt;/li&gt;&lt;li&gt;Une solution reposant sur Azure.&lt;/li&gt;&lt;/ul&gt;Bien que nous ayons choisi la troisième solution dans notre application, nous avions au préalable fait un petit projet de file de messages pour prendre en main les .Net Services. C'est ce projet que je vais vous présenter dans ce lab.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_c-W3Vdh5Je4/SV4yXaWFc4I/AAAAAAAAAAs/JoU45BLAaSQ/s1600-h/netservicesConnectivity.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 160px;" src="http://3.bp.blogspot.com/_c-W3Vdh5Je4/SV4yXaWFc4I/AAAAAAAAAAs/JoU45BLAaSQ/s400/netservicesConnectivity.JPG" alt="" id="BLOGGER_PHOTO_ID_5286718390369874818" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Figure 1 :&lt;/span&gt; En haut, client qui push deux messages et la réception dans la file en bas.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Environnement de développement :&lt;/span&gt;&lt;br /&gt;&lt;ul style="color: rgb(51, 102, 255);"&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/express/"&gt;Microsoft Visual Studio 2008&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/info.aspx?na=90&amp;amp;p=&amp;amp;SrcDisplayLang=fr&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=333325fd-ae52-4e35-b531-508d977d32a6&amp;amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f7%2f0%2f3%2f703455ee-a747-4cc8-bd3e-98a615c3aedb%2fdotNetFx35setup.exe"&gt;.&lt;/a&gt;&lt;a href="http://www.microsoft.com/downloads/info.aspx?na=90&amp;amp;p=&amp;amp;SrcDisplayLang=fr&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=333325fd-ae52-4e35-b531-508d977d32a6&amp;amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f7%2f0%2f3%2f703455ee-a747-4cc8-bd3e-98a615c3aedb%2fdotNetFx35setup.exe"&gt;NET Framework 3.5&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=83e1e30f-bd9a-4284-80a6-388ba2e768fd&amp;amp;displaylang=en"&gt;Microsoft .NET Services SDK&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Temps nécessaire :&lt;/span&gt; 30 minutes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Note &lt;/span&gt;: Cette application vise à présenter l'exposition d'un service sur le service bus, en ce sens elle est simpliste et le code présenté a juste un objectif pédagogique.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pré-requis :&lt;/span&gt; Il est nécessaire de posséder un compte Microsoft .Net Services (actuellement l'activation  des comptes se fait par codes d'invitation : informations disponibles &lt;a href="http://portal.ex.azure.microsoft.com/"&gt;ici&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;La première étape de notre lab sera de créer une file de messages (on utilisera la classe Queue de .Net). Comme l'on souhaite avoir une seule file de messages on utilisera le pattern Singleton.&lt;br /&gt;&lt;br /&gt;On écrira donc une classe contenant une méthode qui crée une instance uniquement s'il n'en existe pas encore. Sinon celle-ci renverra une référence vers l'objet qui existe déjà.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;        &lt;span style="color: rgb(51, 51, 255);"&gt;private static &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;QueueMessage &lt;/span&gt;instance = &lt;span style="color: rgb(51, 51, 255);"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;private &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Queue &lt;/span&gt;notreQueue;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//constructeur privé pour qu'on ne puisse pas i&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;nstancier la classe autrement que par la méthode createQueue()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;private &lt;/span&gt;QueueMessage()&lt;br /&gt;{&lt;br /&gt;notreQueue = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;System.Collections.&lt;span style="color: rgb(51, 153, 153);"&gt;Queue&lt;/span&gt;();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public static &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;QueueMessage &lt;/span&gt;createQueue()&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt; //creation d'une nouvelle instance s'il n'en existe pas déjà une.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;if &lt;/span&gt;(instance == &lt;span style="color: rgb(51, 51, 255);"&gt;null&lt;/span&gt;)&lt;br /&gt;  &lt;span style="color: rgb(51, 102, 255);"&gt;return &lt;/span&gt;instance = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;QueueMessage&lt;/span&gt;();&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;else&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(51, 51, 255);"&gt;return &lt;/span&gt;instance;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;On va ensuite créer une interface qui exposera une méthode push pour pousser un message dans la file.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;    [&lt;span style="color: rgb(51, 153, 153);"&gt;ServiceContract&lt;/span&gt;(Name = &lt;span style="color: rgb(153, 0, 0);"&gt;"IQueueContract"&lt;/span&gt;, Namespace = &lt;span style="color: rgb(153, 0, 0);"&gt;"http://ServiceQueue.IQueueContrat"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public interface &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;IQueueCo&lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;ntrat&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;[&lt;span style="color: rgb(51, 153, 153);"&gt;OperationContract&lt;/span&gt;]&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;Push(&lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;message);&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;Notre service implémentera cette classe :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[&lt;span style="color: rgb(51, 153, 153);"&gt;ServiceBehavior&lt;/span&gt;(Name = &lt;span style="color: rgb(102, 0, 0);"&gt;"QueueService"&lt;/span&gt;, Namespace = &lt;span style="color: rgb(102, 0, 0);"&gt;"https://ServiceQueue.QueueService"&lt;/span&gt;)]&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;QueueService &lt;/span&gt;: &lt;span style="color: rgb(51, 153, 153);"&gt;IQueueContrat&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;private &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;QueueMessage &lt;/span&gt;notreQueue;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public string &lt;/span&gt;Push(&lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;message)&lt;br /&gt;{&lt;br /&gt;notreQueue = &lt;span style="color: rgb(51, 153, 153);"&gt;QueueMessage&lt;/span&gt;.createQueue();&lt;br /&gt;notreQueue.Queue.Enqueue(message);&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine("&lt;span style="color: rgb(153, 0, 0);"&gt;Mes&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;sage ajoutée a la &lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;file FIFO: {0}"&lt;/span&gt;, message);&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"La file contient maintena&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;nt {0} messages non consommés"&lt;/span&gt;,notreQueue.Queue.Count);&lt;br /&gt;return message;&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;On va ensuite éditer notre app.config :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_c-W3Vdh5Je4/SV441zDga6I/AAAAAAAAAA0/-PiPy1D5d8c/s1600-h/appconfig.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 173px;" src="http://4.bp.blogspot.com/_c-W3Vdh5Je4/SV441zDga6I/AAAAAAAAAA0/-PiPy1D5d8c/s400/appconfig.JPG" alt="" id="BLOGGER_PHOTO_ID_5286725509468679074" border="0" /&gt;&lt;/a&gt;On utilisera le binding netTcpRelayBinding et le mode de connexion au service bus sera celui par défaut (Relay).&lt;br /&gt;&lt;br /&gt;On peut enfin exposer notre service sur le service bus :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//Identification via la solution et le mot de passe&lt;/span&gt;&lt;br /&gt;string &lt;/span&gt;solutionName = &lt;span style="color: rgb(153, 0, 0);"&gt;"Votre_Soluti&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;on"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.Write(&lt;span style="color: rgb(153, 0, 0);"&gt;"Entrez votre mot de passe : "&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;string &lt;/span&gt;solutionPassword = ReadPassword();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// création du point de terminaison de notre service Queue&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Uri &lt;/span&gt;address = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;Uri(String.Format(&lt;span style="color: rgb(102, 0, 0);"&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;"sb://{0}/services/{1}/QueueService/EndPoint&lt;/span&gt;"&lt;/span&gt;, &lt;span style="color: rgb(51, 153, 153);"&gt;ServiceBusEnvironment&lt;/span&gt;.DefaultRelayHostName, solutionName));&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//Définition des crédentials, le client devra s'authentifier avec un username/password&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var &lt;/span&gt;userNamePasswordServiceBusCredential = &lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(51, 153, 153);"&gt;TransportClientEndpointBehavior&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;userNamePasswordServiceBusCredential.CredentialType = &lt;span style="color: rgb(51, 153, 153);"&gt;TransportClientCredentialType&lt;/span&gt;.UserNamePassword;&lt;br /&gt;&lt;br /&gt;userNamePasswordServiceBusCredential.Credentials.UserName.UserName = solutionName;&lt;br /&gt;userNamePasswordServiceBusCredential.Credentials.UserName.Password = solutionPassword;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//création du service host&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var &lt;/span&gt;host = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;ServiceHost&lt;/span&gt;(&lt;span style="color: rgb(51, 51, 255);"&gt;typeof&lt;/span&gt;(&lt;span style="color: rgb(51, 153, 153);"&gt;QueueService&lt;/span&gt;), address);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//on applique les crédentials a chaque endpoin&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;t&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;foreach &lt;/span&gt;(&lt;span style="color: rgb(51, 153, 153);"&gt;ServiceEndpoint &lt;/span&gt;endpoint &lt;span style="color: rgb(0, 0, 153);"&gt;in &lt;/span&gt;host.Description.Endpoints)&lt;br /&gt;{&lt;br /&gt;           endpoint.Behaviors.Add(userNamePasswordServiceBusCredential);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//ouverture du service&lt;/span&gt;&lt;br /&gt;host.Open();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"Service address: "&lt;/span&gt; + address);&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(153, 0, 0);"&gt;"Press [Enter] to exit"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;Console&lt;/span&gt;.ReadLine();&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;host&lt;/span&gt;.Close();&lt;/blockquote&gt;&lt;br /&gt;Notre service est maintenant disponible sur le service bus :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_c-W3Vdh5Je4/SV5B0HLxdvI/AAAAAAAAAA8/SymNGYuE8dE/s1600-h/listedservices.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 327px; height: 129px;" src="http://2.bp.blogspot.com/_c-W3Vdh5Je4/SV5B0HLxdvI/AAAAAAAAAA8/SymNGYuE8dE/s400/listedservices.jpg" alt="" id="BLOGGER_PHOTO_ID_5286735376116971250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Code complet disponible sur sourceforge : &lt;a href="http://clouditup.svn.sourceforge.net/viewvc/clouditup/Labs/"&gt;ICI&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.matsport-solutions.fr/site/images/tools.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 50px; height: 48px;" src="http://www.matsport-solutions.fr/site/images/tools.png" alt="" border="0" /&gt;&lt;/a&gt;Le prochain lab concernera la solution que nous avons retenu, à savoir créer une file de message reposant sur Azure.&lt;br /&gt;&lt;br /&gt;A bientôt !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-2915227402630311901?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/2915227402630311901/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=2915227402630311901' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/2915227402630311901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/2915227402630311901'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2009/01/lab-3-je-suis-absent-veuillez-laisser.html' title='Lab 3 : Je suis absent, veuillez laisser un message.'/><author><name>Mathieu Chenu</name><uri>http://www.blogger.com/profile/13228294691073267108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_c-W3Vdh5Je4/SV4wpL4SkjI/AAAAAAAAAAc/AA2rroI5Ya4/s72-c/banner_servicebus.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-6487762056338888589</id><published>2008-12-28T09:09:00.000-08:00</published><updated>2008-12-28T12:01:19.254-08:00</updated><title type='text'>Afficher un flux Rss Sur Silverlight</title><content type='html'>Dans le but de maintenir à jour notre application silverlight, notre choix s'est porté sur l'utilisation de flux RSS. En générant un flux à partir de chaque serveur back office, il est beaucoup plus facile d'afficher les dernières vidéos ajoutées sur chacun d'eux.&lt;br /&gt;&lt;br /&gt;RSS est un format d'échange de données, défini en XML, dont la dernière version est la 2.0.&lt;br /&gt;Le fichier XML a la forme suivante :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XFvwMD4K-lA/SVe4_qxdEcI/AAAAAAAAAAU/3_X6yeTcYvg/s1600-h/fichierRSS.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 209px;" src="http://1.bp.blogspot.com/_XFvwMD4K-lA/SVe4_qxdEcI/AAAAAAAAAAU/3_X6yeTcYvg/s320/fichierRSS.png" alt="" id="BLOGGER_PHOTO_ID_5284896091695550914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Créons maintenant un projet silverlight, dans lequel nous allons récupérer toutes nos vidéos contenues dans le fichier XML.&lt;br /&gt;&lt;br /&gt;1)  &lt;span style="font-weight: bold;"&gt;Installer SilverLight Tools&lt;/span&gt; pour Visual Studio .NET 2008 SP1 (&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=c22d6a7b-546f-4407-8ef6-d60c8ee221ed&amp;amp;displaylang=en"&gt;disponible ici&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;2) Dans Visual Studio 2008 :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;File -&gt; New -&gt; Project&lt;/li&gt;&lt;li&gt;Csharp -&gt; Silverlight -&gt; SilverlightApplication&lt;/li&gt;&lt;li&gt;Appelez le "ExempleRSS"&lt;/li&gt;&lt;li&gt;Sélectionnez “&lt;span style="font-style: italic;"&gt;Add a new ASP.NET&lt;/span&gt;" et garder les options par &lt;span style="font-style: italic;"&gt;défaut&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;3) Ajoutez les références &lt;span style="font-weight: bold;"&gt;System.ServiceModel.Syndication&lt;/span&gt; et &lt;span style="font-weight: bold;"&gt;System.Windows.Controls&lt;/span&gt; à votre projet en faisant un &lt;span style="font-style: italic;"&gt;clic droit sur votre projet&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;add reference&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;4) Dans votre page "Page.xaml.cs", ajouter le code suivant au constructeur :&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;WebClient &lt;/span&gt;rssclient = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;WebClient()&lt;/span&gt;;&lt;br /&gt;rssclient.OpenReadCompleted += &lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(51, 204, 0);"&gt;OpenReadCompletedEventHandler&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(rssclient_OpenReadCompleted);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;//URL du flux rss&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;Uri &lt;/span&gt;UriFeed = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;Uri&lt;/span&gt;(&lt;span style="color: rgb(153, 0, 0);"&gt;"http://feeds.feedburner.com/VCMontpellier"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;);&lt;/span&gt;&lt;br /&gt;rssclient.OpenReadAsync(UriFeed);&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;L'objet WebClient permet de communiquer avec le flux RSS. L'appel à la fonction "lire" se fera en "asynchrone", en attendant la fin de son execution avant d'effectuer l'affichage des données.&lt;br /&gt;&lt;br /&gt;5) Pour réaliser cet affichage, commençons par créer notre datagrid. Double cliquez sur "Page.xaml", et en utilisant la toolbox présente sur la gauche de la fenêtre, sélectionnez "datagrid" et placez le entre les balise.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XFvwMD4K-lA/SVfD63pMTbI/AAAAAAAAAAs/pcQYVNFuvhw/s1600-h/xamlgrid.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 105px;" src="http://1.bp.blogspot.com/_XFvwMD4K-lA/SVfD63pMTbI/AAAAAAAAAAs/pcQYVNFuvhw/s400/xamlgrid.png" alt="" id="BLOGGER_PHOTO_ID_5284908103879118258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6) Lecture des informations du fichier XML.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;        &lt;span style="color: rgb(51, 51, 255);"&gt;void &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rssclient_OpenReadCompleted(&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;object &lt;/span&gt;sender, &lt;span style="color: rgb(51, 204, 0);"&gt;OpenReadCompletedEventArgs &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;e)&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;XmlReader &lt;/span&gt;rssreader = &lt;span style="color: rgb(51, 204, 0);"&gt;XmlReader&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.Create(e.Result);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;SyndicationFeed &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;feed = &lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;SyndicationFeed&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.Load(rssreader);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;this&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.feedContent.ItemsSource = feed.Items;&lt;/span&gt;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;L'objet XMLReader nous permet de lire le fichier XML et l'objet Syndication est quand à lui utilisé pour récupérer toutes les informations lues.&lt;br /&gt;Ensuite, il ne nous reste plus qu'à transmettre les données au datagrid.&lt;br /&gt;&lt;br /&gt;7)Pour afficher ces informations, nous avons jusqu'à présent simplement déclarer notre datagrid. Il ne nous reste plus qu'à l'implémenter afin de voir nos données affichées.&lt;br /&gt;&lt;br /&gt;A l'intérieur des balises  &lt;data:datagrid&gt; &lt;/data:datagrid&gt;, nous rajoutons :&lt;br /&gt;&lt;blockquote&gt;&lt;data:&gt;              &lt;&lt;span style="color: rgb(153, 0, 0);"&gt;data&lt;/span&gt;:&lt;span style="color: rgb(153, 0, 0);"&gt;DataGridTextColumn&lt;/span&gt; &lt;span style="color: rgb(255, 102, 0);"&gt;Header&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="Titre"&lt;/span&gt;  Binding="{&lt;span style="color: rgb(153, 0, 0);"&gt;Binding&lt;/span&gt; Path=Title.Text}"/&gt;&lt;br /&gt;&lt;br /&gt;      &lt;&lt;span style="color: rgb(153, 0, 0);"&gt;data&lt;/span&gt;:&lt;span style="color: rgb(153, 0, 0);"&gt;DataGridTextColumn &lt;/span&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;Header&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="Date de sortie"&lt;/span&gt; Binding="{&lt;span style="color: rgb(153, 0, 0);"&gt;Binding&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;Path=PublishDate&lt;/span&gt;}"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;&lt;span style="color: rgb(153, 0, 0);"&gt;data&lt;/span&gt;:&lt;span style="color: rgb(153, 0, 0);"&gt;DataGridTextColumn &lt;/span&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;Header&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;="Résumé"&lt;/span&gt; Binding="{&lt;span style="color: rgb(153, 0, 0);"&gt;Binding&lt;/span&gt; Path=Summary.Text}"/&gt;&lt;br /&gt;&lt;/data:&gt;&lt;br /&gt;&lt;/blockquote&gt;8) Résultat :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XFvwMD4K-lA/SVfOir21IZI/AAAAAAAAAA0/FaBgHjxEZ3w/s1600-h/AfficheRSS.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 155px;" src="http://1.bp.blogspot.com/_XFvwMD4K-lA/SVfOir21IZI/AAAAAAAAAA0/FaBgHjxEZ3w/s400/AfficheRSS.png" alt="" id="BLOGGER_PHOTO_ID_5284919783026139538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion : &lt;/span&gt;&lt;br /&gt;Comme vous avez pu le constater, en quelques lignes de code, il devient très rapide de récupérer et d'afficher le contenu d'un flux RSS. Il ne vous reste plus qu'à installer &lt;span style="font-weight: bold;"&gt;Expression Blend SP1s&lt;/span&gt; (&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=EB9B5C48-BA2B-4C39-A1C3-135C60BBBE66&amp;amp;displaylang=en"&gt;disponible ici&lt;/a&gt;) et de mettre en forme votre affichage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-6487762056338888589?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/6487762056338888589/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=6487762056338888589' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/6487762056338888589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/6487762056338888589'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2008/12/une-actualit-simplifie.html' title='Afficher un flux Rss Sur Silverlight'/><author><name>Sébastien SAPET</name><uri>http://www.blogger.com/profile/06950722356488746362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_XFvwMD4K-lA/SVe4_qxdEcI/AAAAAAAAAAU/3_X6yeTcYvg/s72-c/fichierRSS.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-5870941174950549123</id><published>2008-12-16T14:57:00.000-08:00</published><updated>2008-12-25T13:51:49.445-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amazon Web Services Associates'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaFX'/><category scheme='http://www.blogger.com/atom/ns#' term='WebService'/><title type='text'>Lab 2 : Quand JavaFX se confie à Amazon</title><content type='html'>Au travers de ce lab nous allons voir comment utiliser les WebServices gratuits de Amazon pour récupérer des informations de DVD à partir de son code barre (numéro UPC), en Java et JavaFX.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pourquoi ?&lt;/div&gt;&lt;div&gt;Il est vrai que nous avions déjà démontré comment utiliser les WebServices de Amazon dans notre projet (voir le ticket &lt;a href="http://clouditup.blogspot.com/2008/12/lab-1-amazone-belle-amazone.html"&gt;Amazone, belle amazone&lt;/a&gt;) mais puisque nous cherchons à promouvoir l'interopérabilité des technologies, nous n'avons pas pu résister à tester la compatibilité du SDK de JavaFX qui vient d'être annoncé.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Les outils :&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Java 1.5+&lt;/li&gt;&lt;li&gt;JavaFX 1.0 SDK&lt;/li&gt;&lt;li&gt;NetBeans 6.5 avec le module JavaFX d'installé&lt;/li&gt;&lt;/ul&gt;Le principe :&lt;br /&gt;JavaFX est un langage de script permettant de développer des application internet riches (&lt;a href="http://fr.wikipedia.org/wiki/Rich_Internet_Application"&gt;RIA&lt;/a&gt;), capable d'appeler du code Java standard de façon transparente pour l'utilisateur. Partant de cette idée, nous utiliserons :&lt;ul&gt;&lt;li&gt;JavaFX pour réaliser l'interface et les animations de notre application&lt;/li&gt;&lt;li&gt;Java standard pour consommer les WebServices d'Amazon&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Le code :&lt;br /&gt;La première chose à faire est de créer un projet de type Java standard et de lui ajouter une référence de WebService :&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 196px;" src="http://2.bp.blogspot.com/_p5I-Wnbo0wE/SUvfnDG4_3I/AAAAAAAAAIM/TT8s6QUg9Wo/s400/JavaFX_AWS_1.png" alt="" id="BLOGGER_PHOTO_ID_5281560849964138354" border="0" /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 182px;" src="http://3.bp.blogspot.com/_p5I-Wnbo0wE/SUvfnTAQcWI/AAAAAAAAAIU/aWUtOzUbFNs/s400/javaFX_AWS_2.png" alt="" id="BLOGGER_PHOTO_ID_5281560854231282018" border="0" /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Dans le code Java nous allons créer une classe nommée WebServiceControler et possédant un objet décrivant le point d'entrée du service de Amazon :&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class&lt;/span&gt; WebServiceControler {&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;private&lt;/span&gt; AWSECommerceServicePortType &lt;span style="color: rgb(51, 204, 0);"&gt;m_AWSServicePort&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public&lt;/span&gt; WebServiceControler() {&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;m_AWSServicePort&lt;/span&gt; = &lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt; AWSECommerceService().getAWSECommerceServicePort();&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;div&gt;Dans le code ci-dessus, AWSECommerceService() permet d'obtenir la référence au WebService d'Amazon que nous avons crée auparavant. Nous pouvons ensuite lui demander la connexion au endpoint (service port), en récupérant la liste des opérations et messages gérés dans un objet spécifique de type AWSECommerceServicePortType.&lt;/div&gt;&lt;div&gt;Cette initialisation peut prendre un certain temps, et nous devrons gérer cette attente dans notre code JavaFX pour ne pas frustrer l'utilisateur.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Il nous faut maintenant ajouter une méthode permettant d'effectuer la recherche d'item, en fonction du code UPC donné en paramètre :&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public&lt;/span&gt; AmazonItem searchItem(&lt;span style="color: rgb(51, 51, 255);"&gt;String&lt;/span&gt; upcNumber) {&lt;br /&gt;    &lt;span style="color: rgb(0, 153, 0);"&gt;//On crée un objet décrivant la requête a effectuer&lt;/span&gt;&lt;br /&gt;    ItemLookup request = &lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt; ItemLookup();&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 153, 0);"&gt;//Saisie des paramètres de la requête comme la clé privée du compte AWS&lt;/span&gt;&lt;br /&gt;    request.setAWSAccessKeyId(&lt;span style="color: rgb(255, 102, 102);"&gt; "__VOTRE__CLEE__AWS__" &lt;/span&gt;);&lt;br /&gt;    request.setValidate( &lt;span style="color: rgb(255, 102, 102);"&gt;"False"&lt;/span&gt; );&lt;br /&gt;    request.setXMLEscaping( &lt;span style="color: rgb(255, 102, 102);"&gt;"Single"&lt;/span&gt; );&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 153, 0);"&gt;//Création d'un objet décrivant l'item recherché&lt;/span&gt;&lt;br /&gt;    ItemLookupRequest item = &lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt; ItemLookupRequest();&lt;br /&gt;    item.setIdType( &lt;span style="color: rgb(255, 102, 102);"&gt;"UPC"&lt;/span&gt; );&lt;br /&gt;    item.getItemId().add(upcNumber);&lt;br /&gt;    item.setSearchIndex(&lt;span style="color: rgb(255, 102, 102);"&gt;"DVD"&lt;/span&gt;);&lt;br /&gt;    item.getResponseGroup().add(&lt;span style="color: rgb(255, 102, 102);"&gt;"Images"&lt;/span&gt;);&lt;br /&gt;    item.getResponseGroup().add(&lt;span style="color: rgb(255, 102, 102);"&gt;"ItemAttributes"&lt;/span&gt;);&lt;br /&gt;    item.getResponseGroup().add(&lt;span style="color: rgb(255, 102, 102);"&gt;"EditorialReview"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 153, 0);"&gt;//Ajout de l'item décrit a la requête envoyée à AWS&lt;/span&gt;&lt;br /&gt;    request.setShared(item);&lt;br /&gt;    &lt;span style="color: rgb(51, 51, 255);"&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            ItemLookupResponse response = m_AWSServicePort.itemLookup(request);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 153, 0);"&gt;/*On récupère le premier et l'unique Item car un numéro UPC étant                               unique on ne peut avoir qu'un résultat.*/&lt;/span&gt;&lt;br /&gt;            Item tmpItem = response.getItems().get(0).getItem().get(0);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 153, 0);"&gt;//On utilise ici un objet que nous avons crée nous même beaucoup plus&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;                //simple que le Item de AWS, car le notre ne contient que le titre, le&lt;br /&gt;            //synopsis et la jaquette du DVD&lt;br /&gt;&lt;/span&gt;                AmazonItem newItem = &lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt; AmazonItem();&lt;br /&gt;            newItem.setImageUrl(tmpItem.getLargeImage().getURL());&lt;br /&gt;            newItem.setTitre(tmpItem.getItemAttributes().getTitle());              newItem.setDescription(tmpItem.getEditorialReviews().getEditorialReview().get(0).getContent());&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: rgb(51, 51, 255);"&gt;return&lt;/span&gt; newItem;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: rgb(51, 51, 255);"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;        {&lt;br /&gt;            System.out.println("Caught Exception: " + ex.getLocalizedMessage());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(51, 51, 255);"&gt;return null&lt;/span&gt;;&lt;br /&gt;}&lt;/blockquote&gt;Voici pour la partie Java, le code ci-dessus est commenté pour décrire chacune des lignes présentes.&lt;br /&gt;&lt;br /&gt;Nous allons maintenant utiliser JavaFX pour interagir avec l'utilisateur, et appeler notre méthode de recherche d'item Amazon au besoin.&lt;br /&gt;Sans nous attarder longuement sur la présentation graphique à l'aide de JavaFX, nous allons préciser comment lier les scripts JavaFX au code Java rédigé plus tôt :&lt;br /&gt;&lt;br /&gt;Tout d'abord nous créons un nouveau projet dans NetBeans, de type Application JavaFX, puis nous lui ajoutons une nouvelle référence dans ses librairies : le projet Java créé précédemment.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p5I-Wnbo0wE/SUvrkKOh59I/AAAAAAAAAIc/0jZE37cnRxs/s1600-h/JavaFX_AWS_3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 280px; height: 192px;" src="http://3.bp.blogspot.com/_p5I-Wnbo0wE/SUvrkKOh59I/AAAAAAAAAIc/0jZE37cnRxs/s400/JavaFX_AWS_3.png" alt="" id="BLOGGER_PHOTO_ID_5281573994475153362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Il nous suffit ensuite, en haut de la page de script JavaFX de faire un import des classes voulues, de la même manière qu'un import Java standard :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import&lt;/span&gt; ws.AmazonItem;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import&lt;/span&gt; ws.WebServiceControler;&lt;/blockquote&gt;&lt;br /&gt;Le reste est assez simple puisque l'on va appeler nos fonctions Java au milieu du code du script de façon transparente.&lt;br /&gt;Nous initialisons la connexion au serveur d'Amazon dans un thread séparé pour pouvoir effectuer une animation de chargement en parallèle :&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;wsControler&lt;/span&gt; : WebServiceControler;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class&lt;/span&gt; AWSConnector &lt;span style="color: rgb(51, 51, 255);"&gt;extends&lt;/span&gt; Thread {&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;public override function&lt;/span&gt; run():&lt;span style="color: rgb(51, 51, 255);"&gt;Void&lt;/span&gt; {&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;try&lt;/span&gt; {&lt;br /&gt;         &lt;span style="color: rgb(0, 153, 0);"&gt;wsControler&lt;/span&gt; = &lt;span style="color: rgb(51, 51, 255);"&gt;new&lt;/span&gt; WebServiceControler();&lt;br /&gt;     } &lt;span style="color: rgb(51, 51, 255);"&gt;catch&lt;/span&gt; (ex) {&lt;br /&gt;         System.out.println(&lt;span style="color: rgb(255, 102, 102);"&gt;"exception: {ex}"&lt;/span&gt;);&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;Lorsque la connexion est terminée, nous affichons le champ de saisie (pour le code UPC) et le bouton de validation. Puis lors d'un clic sur le bouton de validation nous utilisons le code suivant :&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;searchButton&lt;/span&gt; : SwingButton = SwingButton {&lt;br /&gt; text: &lt;span style="color: rgb(255, 102, 102);"&gt;"Lancer la recherche"&lt;/span&gt;&lt;br /&gt; onMouseClicked: &lt;span style="color: rgb(51, 51, 255);"&gt;function&lt;/span&gt;( e: MouseEvent ):&lt;span style="color: rgb(51, 51, 255);"&gt;Void&lt;/span&gt; {&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;try&lt;/span&gt; {&lt;br /&gt;         &lt;span style="color: rgb(51, 51, 255);"&gt;var&lt;/span&gt; currentItem : AmazonItem;&lt;br /&gt;         currentItem = &lt;span style="color: rgb(0, 153, 0);"&gt;wsControler&lt;/span&gt;.searchItem(upcTextField.text);&lt;br /&gt;         showDescription(currentItem);&lt;br /&gt;     } &lt;span style="color: rgb(51, 51, 255);"&gt;catch&lt;/span&gt; (myException:Exception) {&lt;br /&gt;         System.out.println(&lt;span style="color: rgb(255, 102, 102);"&gt;"exception: {myException}"&lt;/span&gt;);&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;Aussi simple que ça :)&lt;br /&gt;&lt;br /&gt;Le résultat final est le suivant :&lt;br /&gt;Lancement de la phase d'initialisation et animation de chargement (le nuage se déplace tant que la connexion n'est pas effective)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p5I-Wnbo0wE/SUvx5lEuNoI/AAAAAAAAAIk/aV9nybbqEF4/s1600-h/JavaFX_AWS_4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 304px; height: 377px;" src="http://2.bp.blogspot.com/_p5I-Wnbo0wE/SUvx5lEuNoI/AAAAAAAAAIk/aV9nybbqEF4/s400/JavaFX_AWS_4.png" alt="" id="BLOGGER_PHOTO_ID_5281580959528793730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Puis le résultat une fois que le code UPC a été saisi et que le bouton "Lancer la recherche" a été pressé :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p5I-Wnbo0wE/SUvx5-wl0FI/AAAAAAAAAIs/Nrk5CWO588g/s1600-h/JavaFX_AWS_5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 335px;" src="http://2.bp.blogspot.com/_p5I-Wnbo0wE/SUvx5-wl0FI/AAAAAAAAAIs/Nrk5CWO588g/s400/JavaFX_AWS_5.png" alt="" id="BLOGGER_PHOTO_ID_5281580966423679058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Conclusion :&lt;br /&gt;Ce lab met donc en avant la possibilité de réaliser, avec la solution de Sun Microsystem, des consommations de WebServices dont nous ne connaissons pas la technologie support.&lt;br /&gt;JavaFX est sorti en première version, il y a quelques semaines, mais son support du code Java standard lui permet d'hériter des possibilités de son ainé en terme de communication sur le web, qui existent depuis plusieurs années maintenant.&lt;br /&gt;L'utilisation de JavaFX pour réaliser cette application nous offre le choix des modalités de déploiement : ce sera une application lourde ou une application web.&lt;br /&gt;&lt;br /&gt;L'ensemble du code des labs sera bientôt disponible, nous n'attendons que la validation du projet par SourceForge.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-5870941174950549123?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/5870941174950549123/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=5870941174950549123' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/5870941174950549123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/5870941174950549123'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2008/12/lab-2-quand-javafx-se-confie-amazon.html' title='Lab 2 : Quand JavaFX se confie à Amazon'/><author><name>Maxime Britto</name><uri>http://www.blogger.com/profile/12048362267455309200</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_p5I-Wnbo0wE/SUvfnDG4_3I/AAAAAAAAAIM/TT8s6QUg9Wo/s72-c/JavaFX_AWS_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-6097211731156955757</id><published>2008-12-13T16:14:00.000-08:00</published><updated>2009-01-02T14:33:30.523-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='live id'/><category scheme='http://www.blogger.com/atom/ns#' term='open id'/><category scheme='http://www.blogger.com/atom/ns#' term='authentification'/><category scheme='http://www.blogger.com/atom/ns#' term='google account'/><title type='text'>Mais qui suis-je ?</title><content type='html'>Dans le but d'offrir un service performant, complet et surtout standardisé, nous nous sommes penché sur le problème de l'authentification.&lt;br /&gt;Nous pourrions créer un système d'identification propre à notre portail, mais cela ferme la porte à la communication inter-service sur internet. Dans le cadre de l'interopérabilité, ciblée depuis le départ, il apparaît donc évident d'offrir aux utilisateurs le moyen de s'authentifier avec leurs identifiants habituels. Ce sont ceux qu'ils utilisent tous les jours sur des sites comme Google, Windows Live...&lt;br /&gt;&lt;br /&gt;L'authentification consiste en la saisie de vos identifiants. Une requête est alors envoyée à un serveur d'authentification, qui valide ou non votre identité. Il devient alors possible d'accéder à vos informations, comme votre nom, votre prénom... Ceci nous permettrait donc d'offrir des options à nos utilisateurs, sur le portail de VOD, telle l'option "Conseiller ce film à un ami", proposant la liste des contacts du compte Windows Live, par exemple.&lt;br /&gt;&lt;br /&gt;Certains identifiants (notamment Windows live ID) sont disponibles pour les clients lourds. En revanche, certains ne sont utilisables qu'à l'aide de clients légers, comme par exemple des applications web ASP ou JSP.&lt;br /&gt;&lt;br /&gt;Ainsi, je vais vous présenter quelques uns des nombreux services d'authentification existant en ligne et leurs particularités :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  - Windows Live ID&lt;/span&gt;&lt;br /&gt;Cet identifiant est celui utilisé par les services Windows (msn, azure...), au travers notamment, du Passport .Net pour les clients lourds.&lt;br /&gt;Ce mode d'authentification est très facile à implémenter, notamment sous environnement .Net et J2EE (avec JSP).&lt;br /&gt;Vous pouvez télécharger les SDK de Windows Live ID à l'adresse suivante :&lt;br /&gt;&lt;a href="http://dev.live.com/liveID/default.aspx"&gt;http://dev.live.com/liveID/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9jevx37O5Iw/SURUOXiZ89I/AAAAAAAAAB0/_623D8UERRU/s1600-h/authliveID.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 197px;" src="http://1.bp.blogspot.com/_9jevx37O5Iw/SURUOXiZ89I/AAAAAAAAAB0/_623D8UERRU/s320/authliveID.png" alt="" id="BLOGGER_PHOTO_ID_5279437268998288338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  - Open ID&lt;/span&gt;&lt;br /&gt;Ce système d'authentification offre une authentification unique à tous vos sites. Ainsi, en vous authentifiant sur OpenID, vous vous identifiez aussi sur votre compte Windows Live, sur votre compte Yahoo, ainsi que sur tout autre site ayant accepté le lien entre OpenID et leurs services.&lt;br /&gt;Néanmoins, il semblerait que ce système ne soit accessible que depuis un client léger, ce qui limite son utilisation aux seuls sites web.&lt;br /&gt;Une des originalités de ce service réside dans l'utilisation d'une URL comme identifiant. Par exemple, l'URL suivante est l'identifiant OpenID que j'utilise pour mes tests : http://cloudisgood.myopenid.com/ . Cette URL donne aussi accès à mon espace personnel, sur lequel je peux diffuser des informations.&lt;br /&gt;Téléchargez les librairies OpenID Authentication pour Java et .Net aux adresses suivantes :&lt;br /&gt;&lt;a href="http://code.google.com/p/openid4java/"&gt;http://code.google.com/p/openid4java/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/dotnetopenid/"&gt;http://code.google.com/p/dotnetopenid/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.tangolab.net/lebloglab/images/2007/juin/logo_openid.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 337px; height: 200px;" src="http://www.tangolab.net/lebloglab/images/2007/juin/logo_openid.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  - Google Account&lt;/span&gt;&lt;br /&gt;Ce mode d'authentification offre un accès à son compte Google. Comme pour Windows Live, il est possible de l'implémenter dans une application lourde, et dans des applications webs.&lt;br /&gt;Son utilisation ouvre les portes aux services Google, comme Blogger, Gmail...&lt;br /&gt;Vous pouvez trouver plus d'informations sur l'API Account Authentication de Google et son implémentation à l'adresse suivante :&lt;br /&gt;&lt;a href="http://code.google.com/intl/fr/apis/accounts/"&gt;http://code.google.com/intl/fr/apis/accounts/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9jevx37O5Iw/SURZyC9_OuI/AAAAAAAAAB8/N1NEbbV_6p4/s1600-h/google.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 148px; height: 51px;" src="http://2.bp.blogspot.com/_9jevx37O5Iw/SURZyC9_OuI/AAAAAAAAAB8/N1NEbbV_6p4/s320/google.png" alt="" id="BLOGGER_PHOTO_ID_5279443379510262498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A noter : &lt;/span&gt;la plupart des services d'authentification ne permettent pas la saisie du mot de passe directement dans l'application cliente, pour des raisons de sécurité évidentes. Par conséquent, l'utilisateur saisi ses informations dans une page web du serveur d'authentification (exemple : OpenID), ou directement dans une fenêtre applicative indépendante de l'application cliente (exemple : Windows Live).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion &lt;/span&gt;&lt;br /&gt;Il est donc relativement facile d'offrir à nos utilisateurs une authentification simplifiée au travers de leurs identifiants habituels. Nous développons ainsi l'étendue du service que nous offrons.&lt;br /&gt;Je vous présenterai prochainement comment s'authentifier auprès de Windows Live, au travers d'un Lab .Net et Java !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-6097211731156955757?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/6097211731156955757/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=6097211731156955757' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/6097211731156955757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/6097211731156955757'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2008/12/qui-suis-je.html' title='Mais qui suis-je ?'/><author><name>Léo Pratlong</name><uri>http://www.blogger.com/profile/06248885726738094783</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9jevx37O5Iw/SURUOXiZ89I/AAAAAAAAAB0/_623D8UERRU/s72-c/authliveID.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-2972398376569653044</id><published>2008-12-02T03:49:00.000-08:00</published><updated>2008-12-02T07:36:02.497-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Amazon Web Services Associates'/><title type='text'>Lab 1 : Amazone, belle Amazone.</title><content type='html'>A travers ce lab je me propose de vous présenter une petite application permettant de récupérer des informations (titre, jaquettes, résumé…) sur des DVD en fonction de leur Universal Product Code (UPC).&lt;br /&gt;&lt;p style="text-align: justify; font-family: arial;" class="MsoNormal"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_c-W3Vdh5Je4/STUty3R5-XI/AAAAAAAAAAM/RpvIuy3WRZE/s1600-h/AWS.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 268px;" src="http://4.bp.blogspot.com/_c-W3Vdh5Je4/STUty3R5-XI/AAAAAAAAAAM/RpvIuy3WRZE/s320/AWS.JPG" alt="" id="BLOGGER_PHOTO_ID_5275172890390165874" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Fig 1&lt;/span&gt; : Exemple de l'application&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-weight: bold;"&gt;Environnement de développement :&lt;/span&gt;&lt;br /&gt;* &lt;a style="font-weight: bold; color: rgb(51, 102, 255);" href="http://www.microsoft.com/express/vcsharp/"&gt;Microsoft Visual C# 2008 Express Edition&lt;/a&gt;&lt;br /&gt;* &lt;a style="font-weight: bold; color: rgb(51, 102, 255);" href="http://www.microsoft.com/downloads/info.aspx?na=90&amp;amp;p=&amp;amp;SrcDisplayLang=fr&amp;amp;SrcCategoryId=&amp;amp;SrcFamilyId=333325fd-ae52-4e35-b531-508d977d32a6&amp;amp;u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f7%2f0%2f3%2f703455ee-a747-4cc8-bd3e-98a615c3aedb%2fdotNetFx35setup.exe"&gt;.NET Framework 3.5&lt;/a&gt;&lt;br /&gt;* &lt;a style="font-weight: bold; color: rgb(51, 102, 255);" href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=891&amp;amp;categoryID=14"&gt;C# Library for Amazon Associates Web Service&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Temps nécessaire :&lt;/span&gt; 30 minutes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Note &lt;/span&gt;: Cette application vise à valider l’utilisation des Amazon Web Services dans notre architecture, en ce sens elle est simpliste et le code présenté à juste un objectif pédagogique.&lt;br /&gt;&lt;br /&gt;La première chose à faire est de créer un Amazon Web Services Account sur &lt;a style="color: rgb(51, 102, 255);" href="http://aws.amazon.com/"&gt;http://aws.amazon.com/&lt;/a&gt; afin de récupérer votre &lt;span style="font-weight: bold;"&gt;Access Key ID&lt;/span&gt; et votre &lt;span style="font-weight: bold;"&gt;Secret Access Key&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;On peut ensuite créer notre application Windows Forms et ajouter notre librairie à la solution (via ajouter -&gt; projet existant -&gt; AmazonECS.csproj).&lt;br /&gt;&lt;br /&gt;Une fois que votre fenêtre est faites, on va pouvoir ajouter le code nécessaire à la demande d'information et au traitement de la réponse.&lt;br /&gt;&lt;br /&gt;Lors de chaque requête, il faut transmettre nos clés d'accès à amazon. Ces clés ainsi que l'adresse du site que l'on souhaite interroger sont encapsulés dans un objet AmazonECSQuery.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;String &lt;/span&gt;accessKeyId = &lt;span style="color: rgb(153, 0, 0);"&gt;"votreAcessKeyId"&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;String &lt;/span&gt;secretAccessKey =&lt;span style="color: rgb(153, 0, 0);"&gt; "votreSecretAccessKey"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;service = new &lt;span style="color: rgb(51, 153, 153);"&gt;AmazonECSQuery&lt;/span&gt;(accessKeyId, secretAccessKey, &lt;span style="color: rgb(51, 153, 153);"&gt;AmazonECSLocale&lt;/span&gt;.FR);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;On définit ensuite ce que l'on souhaite obtenir dans un objet ItemLookupRequest&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;var &lt;/span&gt;requete = &lt;span style="color: rgb(51, 51, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;ItemLookupRequest&lt;/span&gt;();&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//On recherche par UPC&lt;/span&gt;&lt;br /&gt;requete.IdType = "UPC";&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// des DVDS&lt;/span&gt;&lt;br /&gt;requete.SearchIndex = "DVD";&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//On veut les images&lt;/span&gt;&lt;br /&gt;requete.ResponseGroup.Add("Images");&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//Les attributs de l'item (titre, auteurs, producteur...)&lt;/span&gt;&lt;br /&gt;requete.ResponseGroup.Add("ItemAttributes");&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;// Les avis éditoriaux contient notre résumé&lt;/span&gt;&lt;br /&gt;requete.ResponseGroup.Add("EditorialReview");&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//On ajoute l'indentifiant que l'utilisateur à saisit dans la textBox;&lt;/span&gt;&lt;br /&gt;requete.ItemId.Add(TextBox1.Text);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;J'ai ensuite créé une classe qui effectue la requête et traite les résultats via la méthode suivante :&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public void&lt;/span&gt; trouve(&lt;span style="color: rgb(51, 153, 153);"&gt;AmazonECS &lt;/span&gt;service, &lt;span style="color: rgb(51, 51, 255);"&gt;params &lt;/span&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;ItemLookupRequest&lt;/span&gt;[] request)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;try&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;/*Si la requête retourne une erreur(numéro UPC qui n'existe pas par exemple), on passe dans le catch*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;ItemLookupResponse &lt;/span&gt;response = service.ItemLookup(request);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;/*Items contient des informations qui ne nous intéressent pas dans cette exemple comme le nombre de résultats. On récupère le premier et l'unique Item car un numéro UPC étant unique on ne peut avoir qu'un résultat.*/&lt;/span&gt;&lt;br /&gt;Item item = response.Items[0].Item[0];&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//si le numéro Amazon Standard Identification Number (ASIN) est retourné&lt;/span&gt;&lt;br /&gt;if (item.IsSetASIN())&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;//on l'affiche&lt;/span&gt;&lt;br /&gt;maFenetre.TextBox2.Text = item.ASIN;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;if&lt;/span&gt; (item.IsSetMediumImage())&lt;br /&gt;{&lt;br /&gt;/*la propriété ImageLocation d'une PictureBox permet d'afficher une image à partir de son URL*/&lt;br /&gt;maFenetre.PictureBox1.ImageLocation = item.MediumImage.URL;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;if&lt;/span&gt;(item.IsSetItemAttributes())&lt;br /&gt;{&lt;br /&gt;maFenetre.TextBox3.Text = item.ItemAttributes.Title;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;if&lt;/span&gt;(item.IsSetEditorialReviews())&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;/*La première case du tableau Editorial Review correspond a notre premier item; On en récupère le contenu;*/&lt;/span&gt;&lt;br /&gt;maFenetre.TextBox4.Text = item.EditorialReviews.EditorialReview[0].Content;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;catch &lt;/span&gt;(&lt;span style="color: rgb(51, 153, 153);"&gt;AmazonECSException &lt;/span&gt;ex)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 153, 153);"&gt;MessageBox&lt;/span&gt;.Show("Caught Exception: " + ex.Message);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Pour cet exemple je n'ai pas fait de classes métier DVD et j'affiche directement les valeurs retournés dans les champs. Si vous souhaitez tester votre application, voici &lt;a style="color: rgb(51, 102, 255);" href="http://www.upcdatabase.com/"&gt;une base de données &lt;/a&gt;permettant de rechercher des UPC.&lt;br /&gt;&lt;br /&gt;Il est aussi très intéressant de capturer les trames et de regarder le dialogue avec amazon.&lt;br /&gt;&lt;br /&gt;Si vous souhaitez récupérer d'autres champs, &lt;a style="color: rgb(51, 102, 255);" href="http://docs.amazonwebservices.com/AWSECommerceService/2008-08-19/DG/"&gt;la documentation amazon&lt;/a&gt; sera d'une aide préçieuse.&lt;br /&gt;&lt;br /&gt;Le code source de l'application est disponible sur simple demande&lt;span style="color: rgb(51, 102, 255);"&gt; &lt;/span&gt;&lt;a style="color: rgb(51, 102, 255);" href="http://www.blogger.com/Mathieu.Chenu@gmail.com"&gt;e-mail&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pour conclure, mon impression est qu'il serait trés simple d'utiliser les WS Amazon pour récuperer des informations sur des films et que cela serait une plus value intéressante pour notre projet.&lt;br /&gt;&lt;br /&gt;Rendez vous la semaine prochaine pour un nouveau lab sur.... une surprise !&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-2972398376569653044?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/2972398376569653044/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=2972398376569653044' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/2972398376569653044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/2972398376569653044'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2008/12/lab-1-amazone-belle-amazone.html' title='Lab 1 : Amazone, belle Amazone.'/><author><name>Mathieu Chenu</name><uri>http://www.blogger.com/profile/13228294691073267108</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_c-W3Vdh5Je4/STUty3R5-XI/AAAAAAAAAAM/RpvIuy3WRZE/s72-c/AWS.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-3215317795769994682</id><published>2008-11-30T09:45:00.000-08:00</published><updated>2008-11-30T15:52:49.757-08:00</updated><title type='text'>Le troisième mousquetaire</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#551A8B;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#551A8B;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://media.amazonwebservices.com/logo_aws.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 164px; height: 60px;" src="http://media.amazonwebservices.com/logo_aws.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Nous avons proposé, dans notre architecture, de nous appuyer sur les Web Services d'Amazon pour récupérer les informations de chaque vidéo disponible à la location. Ces informations regrouperaient le titre, le casting complet du film, le synopsis ainsi que l'affiche.&lt;div&gt;Ce choix présente selon nous deux avantages :&lt;div&gt;&lt;ul&gt;&lt;li&gt;Faciliter l'ajout de films à la base de données d'une boutique.&lt;/li&gt;&lt;li&gt;Maintenir à jour les informations de la base de donnée centrale.&lt;/li&gt;&lt;/ul&gt;De façon plus générale, il s'agirait d'ajouter un troisième grand nom des web services pour réaliser un projet interopérable mélant .Net, Java et AWS (Amazon Web Services).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Concrètement, nous utiliserions Amazon Associate Web Services pour obtenir la fiche film complète à partir du Code Universel Produit (souvent affiché sous forme d'un code-barres). La saisie du code barre se ferait dans une des boutiques de location qui interrogerait notre front office. Dans le cas où celui-ci ne connaîtrait pas encore ce film, il serait chargé de recueillir les informations depuis le service d'Amazon pour créer une nouvelle fiche qu'il conserverait. Cette fiche serait ensuite utilisée à la fois par les magasins et par le site de VOD.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 50px; height: 48px;" src="http://www.matsport-solutions.fr/site/images/tools.png" border="0" alt="" /&gt;&lt;/div&gt;&lt;div&gt;Chaque Web Service externe que nous choisirons d'utiliser sur ce projet sera testé au préalable sur Cloud it up. A ce titre, un logiciel sachant communiquer avec Amazon devrait trouver le chemin du blog dans les prochains jours, suivi dès la semaine prochaine par un autre utilisateur de Web Services.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-3215317795769994682?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/3215317795769994682/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=3215317795769994682' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/3215317795769994682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/3215317795769994682'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2008/11/le-troisime-mousquetaire.html' title='Le troisième mousquetaire'/><author><name>Maxime Britto</name><uri>http://www.blogger.com/profile/12048362267455309200</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-420517655758271701</id><published>2008-11-27T13:51:00.000-08:00</published><updated>2008-12-05T20:29:03.309-08:00</updated><title type='text'>Jouons aux légos !</title><content type='html'>&lt;div style="text-align: left;"&gt;Une brique dans une brique dans une brique, elle-même dans une brique... Cela nous donne ? Un service de Video On Demand mettant en place de l'interopérabilité entre une application J2EE et une plate-forme de services Azure.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;a href="http://mascou.hd.free.fr/Architecture_non_transparent.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 277px;" src="http://4.bp.blogspot.com/_p5I-Wnbo0wE/STn9aY_nvtI/AAAAAAAAAIE/8Fo3tJSWbYA/s400/Architecture_non+transparent.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5276527068268969682" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 26, 139);"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;Sur l'architecture ci-dessus, nous pouvons voir le serveur applicatif J2EE associé à un serveur GlassFish, qui nous permettra l'administration du portail. Les données et blobs situés sur la base de données SQL Server seront transmis à la plate-forme de services Azure qui les accueillera grâce à ses SQL Services (merci Azure !).&lt;br /&gt;&lt;br /&gt;Les communications entre les .Net Services et l'application J2EE se feront à l'aide du protocole SOAP.&lt;br /&gt;&lt;br /&gt;Notre application située dans les nuages utilisera le Web service Amazon S3 afin d'obtenir des informations sur les films stockés (jaquettes, synopsis, noms des acteurs...).&lt;br /&gt;&lt;br /&gt;Enfin, le client pourra se connecter sur une application Silverlight à l'aide de ses identifiants Windows Live, et bénéficiera de notre VOD.&lt;br /&gt;&lt;br /&gt;Espérons que les murs tiendront... Néanmoins, les fondations ont l'air solides !&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-420517655758271701?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/420517655758271701/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=420517655758271701' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/420517655758271701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/420517655758271701'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2008/11/jouons-aux-lgos.html' title='Jouons aux légos !'/><author><name>Léo Pratlong</name><uri>http://www.blogger.com/profile/06248885726738094783</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_p5I-Wnbo0wE/STn9aY_nvtI/AAAAAAAAAIE/8Fo3tJSWbYA/s72-c/Architecture_non+transparent.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7994229971187218600.post-5743392051996327186</id><published>2008-11-22T10:40:00.000-08:00</published><updated>2008-12-02T10:16:36.897-08:00</updated><title type='text'>Une école dans les nuages</title><content type='html'>&lt;p class="MsoNormal" style="text-align: justify;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: justify;"&gt;Au cours de notre dernière année à l’EPSI Montpellier et grâce à un partenariat avec Microsoft, un enseignement sur le Cloud Computing a pu être mis en place pour l’option génie logiciel.&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XFvwMD4K-lA/STVXPwMrebI/AAAAAAAAAAM/TOj9djra_sM/s1600-h/cloud.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 154px; height: 114px;" src="http://2.bp.blogspot.com/_XFvwMD4K-lA/STVXPwMrebI/AAAAAAAAAAM/TOj9djra_sM/s320/cloud.png" alt="" id="BLOGGER_PHOTO_ID_5275218466682141106" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align: left;"&gt;Au terme d’un programme de 24h de cours et td, M. Sfartz, architecte en système d’information chez Microsoft et M. Martos, professeur de Génie Logiciel Avancé à l’EPSI ont donné à leurs étudiants un projet.&lt;br /&gt;&lt;br /&gt;Ce projet intitulé « TonTube » a pour but de mettre en pratique toutes les notions acquises pendant ces cours et travaux dirigés. La société «TonTube » est une société de location de DVD (600 magasins) souhaitant s’exporter sur internet. L’objectif de la société est donc de développer une application de type vidéothèque, permettant à chaque internaute de louer et visionner sa vidéo en ligne. Il sera bien sûr nécessaire de lier le site de Video On Demand aux applications back office de gestion des magasins.&lt;br /&gt;&lt;br /&gt;Notre équipe projet est composée de 4 étudiants, tous en dernière année à l’EPSI Montpellier : &lt;a style="color: rgb(51, 51, 255);" href="mailto:maxime.britto@gmail.com"&gt;Maxime Britto&lt;/a&gt;, &lt;a style="color: rgb(51, 51, 255);" href="mailto:mathieu.chenu@gmail.com"&gt;Mathieu Chenu&lt;/a&gt;, &lt;a style="color: rgb(51, 51, 255);" href="mailto:leo.pratlong@gmail.com"&gt;Léo Pratlong&lt;/a&gt; et &lt;a style="color: rgb(51, 51, 255);" href="mailto:sebastien.sapet@gmail.com"&gt;Sébastien Sapet&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Toutes les informations que vous trouverez sur ce blog auront pour but d’illustrer l’avancement de notre projet, et de vous présenter l’architecture, les technologies et les moyens utilisés dans ce projet de Cloud Computing et d’interopérabilité.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7994229971187218600-5743392051996327186?l=clouditup.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://clouditup.blogspot.com/feeds/5743392051996327186/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7994229971187218600&amp;postID=5743392051996327186' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/5743392051996327186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7994229971187218600/posts/default/5743392051996327186'/><link rel='alternate' type='text/html' href='http://clouditup.blogspot.com/2008/11/une-cole-dans-les-nuages.html' title='Une école dans les nuages'/><author><name>Sébastien SAPET</name><uri>http://www.blogger.com/profile/06950722356488746362</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_XFvwMD4K-lA/STVXPwMrebI/AAAAAAAAAAM/TOj9djra_sM/s72-c/cloud.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
