<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Simon Boigelot</title>
    <description>Directeur Innovation @ &lt;a href="http://www.heode.com" style="color:white;"&gt;Heode&lt;/a&gt;</description>
    <link>http://www.simonboigelot.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>fr-BE</language>
    <blogChannel:blogRoll>http://www.simonboigelot.com/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Simon Boigelot</dc:creator>
    <dc:title>Simon Boigelot</dc:title>
    <itunes:explicit>no</itunes:explicit><itunes:subtitle>Directeur Innovation @ Heode</itunes:subtitle><itunes:summary>Directeur Innovation @ Heode</itunes:summary><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/SimonBoigelotWorld" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Une page Facebook pour Heode</title>
      <description>&lt;p&gt;Depuis peu Heode est présent sur Facebook.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.facebook.com/home.php#/pages/Liege-Belgium/Heode/64281368646"&gt;N’hésitez pas à nous rendre visite !&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.facebook.com/home.php#/pages/Liege-Belgium/Heode/64281368646"&gt;&lt;img alt="Heode" src="http://profile.ak.facebook.com/object3/1516/72/n64281368646_6725.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SimonBoigelotWorld/~4/aRl7a7ZKL74" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/SimonBoigelotWorld/~3/aRl7a7ZKL74/post.aspx</link>
      <author>simon.boigelot.nospam@nospam.heode.com (Togis)</author>
      <comments>http://www.simonboigelot.com/post/Une-page-Facebook-pour-Heode.aspx#comment</comments>
      <guid isPermaLink="false">http://www.simonboigelot.com/post.aspx?id=3353008c-4531-4b9f-8f5a-1e403cf93582</guid>
      <pubDate>Tue, 07 Apr 2009 06:22:10 -0400</pubDate>
      <dc:publisher>Togis</dc:publisher>
      <pingback:server>http://www.simonboigelot.com/pingback.axd</pingback:server>
      <pingback:target>http://www.simonboigelot.com/post.aspx?id=3353008c-4531-4b9f-8f5a-1e403cf93582</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.simonboigelot.com/trackback.axd?id=3353008c-4531-4b9f-8f5a-1e403cf93582</trackback:ping>
      <wfw:comment>http://www.simonboigelot.com/post/Une-page-Facebook-pour-Heode.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.simonboigelot.com/syndication.axd?post=3353008c-4531-4b9f-8f5a-1e403cf93582</wfw:commentRss>
    <feedburner:origLink>http://www.simonboigelot.com/post.aspx?id=3353008c-4531-4b9f-8f5a-1e403cf93582</feedburner:origLink></item>
    <item>
      <title>Silverlight 3 – First look</title>
      <description>&lt;h2&gt;Avant propos&lt;/h2&gt;  
&lt;p&gt;
Voici un article sur Silverlight 3 que j&amp;rsquo;ai du &amp;eacute;crire pour un magasine. Veuillez me pardonner s&amp;rsquo;il n&amp;rsquo;est pas exhaustif mais j&amp;#39;ai eu tant de chose &amp;agrave; dire et si peu de place pour le dire&amp;hellip;
&lt;/p&gt;
  
&lt;p&gt;
J&amp;rsquo;esp&amp;egrave;re n&amp;eacute;anmoins qu&amp;rsquo;il sera utile &amp;agrave; l&amp;rsquo;un ou l&amp;rsquo;autre d&amp;rsquo;entre vous.
&lt;/p&gt;
  
&lt;h2&gt;Installation sur machine cliente et travail en mode offline&lt;/h2&gt;  
&lt;p&gt;
Alors que Silverlight 2 ne fonctionne qu&amp;rsquo;en mode online et &amp;agrave; l&amp;rsquo;int&amp;eacute;rieur d&amp;rsquo;un navigateur, la version 3 de la plateforme ne respecte plus ces limitations.
&lt;/p&gt;
  
&lt;p&gt;
En effet, lors de la visite d&amp;rsquo;un utilisateur sur une application Silverlight 3, ce dernier &amp;agrave; l&amp;rsquo;opportunit&amp;eacute; de t&amp;eacute;l&amp;eacute;charger et installer cette application sur son syst&amp;egrave;me d&amp;rsquo;op&amp;eacute;ration. Ainsi cette application lui deviendra accessible m&amp;ecirc;me lorsqu&amp;rsquo;il ne sera pas connect&amp;eacute; &amp;agrave; internet.
&lt;/p&gt;
  
&lt;p&gt;
Bien sur, nous devons prendre en compte que si l&amp;rsquo;application doit r&amp;eacute;cup&amp;eacute;rer des donn&amp;eacute;es sur un serveur, cela restera impossible en mode offline. Cependant, une bonne gestion d&amp;rsquo;un cache de donn&amp;eacute;es et de la concurrence lors des mises &amp;agrave; jour pourra tout de m&amp;ecirc;me permettre un travail offline sur des donn&amp;eacute;es online.
&lt;/p&gt;
  
&lt;p&gt;
Dans cet article nous allons apprendre &amp;agrave; :
&lt;/p&gt;
  
&lt;ul&gt;
	&lt;li&gt;&amp;nbsp;
	&lt;ul&gt;
		     
		&lt;li&gt;Rendre une application Silverlight 3 t&amp;eacute;l&amp;eacute;chargeable &lt;/li&gt;      
		&lt;li&gt;D&amp;eacute;tecter si l&amp;rsquo;application est :        
		&lt;ul&gt;
			         
			&lt;li&gt;Install&amp;eacute;e sur le bureau ou sous navigateur &lt;/li&gt;          
			&lt;li&gt;Online ou offline. &lt;/li&gt;       
		&lt;/ul&gt;
		     &lt;/li&gt;      
		&lt;li&gt;R&amp;eacute;cup&amp;eacute;rer des donn&amp;eacute;es &amp;agrave; partir du site h&amp;ocirc;te de l&amp;rsquo;application &lt;/li&gt;   
	&lt;/ul&gt;
	&lt;/li&gt;    
&lt;/ul&gt;
  
&lt;p&gt;
Avant de commencer, notez que les pr&amp;eacute;-requis pour cet article sont :
&lt;/p&gt;
  
&lt;ul&gt;
	&lt;li&gt;&amp;nbsp;
	&lt;ul&gt;
		     
		&lt;li&gt;Conna&amp;icirc;tre les bases de la plateforme .Net &lt;/li&gt;      
		&lt;li&gt;Installer Visual Studio 2008 (dont la version express est gratuite)&amp;nbsp;&amp;nbsp; &lt;br /&gt;
		&lt;em&gt;&lt;font size="2" color="#ff8000"&gt;Attention, installez la version anglaise, les Tools et SDK n&amp;rsquo;existent que en anglais pour l&amp;rsquo;instant !&lt;/font&gt;&lt;/em&gt; &lt;/li&gt;      
		&lt;li&gt;Installer les Silverlight 3 Tools et SDK ainsi que les .Net RIA services (&lt;a href="http://www.silverlight.net/GetStarted/silverlight3"&gt;http://www.silverlight.net/GetStarted/silverlight3&lt;/a&gt;) &lt;/li&gt;   
	&lt;/ul&gt;
	&lt;/li&gt;    
&lt;/ul&gt;
  
&lt;h2&gt;Bases de l&amp;rsquo;application&lt;/h2&gt;  
&lt;ul&gt;
	&lt;li&gt;&amp;nbsp;
	&lt;ul&gt;
		     
		&lt;li&gt;&lt;em&gt;D&amp;eacute;marrez&lt;/em&gt; &lt;strong&gt;Visual Studio 2008&lt;/strong&gt; &lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Ouvrez&lt;/em&gt; le menu &lt;strong&gt;File&lt;/strong&gt; &amp;agrave; &lt;strong&gt;New Project &amp;hellip;&lt;/strong&gt; &lt;/li&gt;      
		&lt;li&gt;Dans la bo&amp;icirc;te de dialogue &amp;laquo; &lt;strong&gt;New Project&lt;/strong&gt; &amp;raquo; qui apparait, &lt;em&gt;choisissez&lt;/em&gt; &amp;laquo; &lt;strong&gt;.Net Framework 3.5 &lt;/strong&gt;&amp;raquo; et sous le type de projet &amp;laquo; &lt;strong&gt;Silverlight&lt;/strong&gt; &amp;raquo; : &amp;laquo; &lt;strong&gt;Silverlight Application&lt;/strong&gt; &amp;raquo;         &lt;br /&gt;
		&lt;a href="http://www.simonboigelot.com/image.axd?picture=clip_image002.jpg"&gt;&lt;img style="border-width: 0px; display: inline" src="http://www.simonboigelot.com/image.axd?picture=clip_image002_thumb.jpg" border="0" alt="clip_image002" title="clip_image002" width="244" height="165" /&gt;&lt;/a&gt; &lt;/li&gt;      
		&lt;li&gt;N&amp;rsquo;oubliez pas de lui &lt;em&gt;donner un nom&lt;/em&gt;, dans ce cas-ci : &amp;laquo; &lt;strong&gt;OutOfBrowser&lt;/strong&gt; &amp;raquo; &lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Cliquez&lt;/em&gt; sur &lt;strong&gt;Ok&lt;/strong&gt;.         &lt;br /&gt;
		&lt;/li&gt;      
		&lt;li&gt;Une nouvelle bo&amp;icirc;te de dialogue appara&amp;icirc;t : &amp;laquo; &lt;strong&gt;New Silverlight Application&lt;/strong&gt; &amp;raquo;. Prenez soin de &lt;em&gt;cocher&lt;/em&gt; l&amp;rsquo;option &amp;laquo; &lt;strong&gt;Link to ASP.Net server project&lt;/strong&gt; &amp;raquo;. Cette option activera le lien &lt;em&gt;.Net RIA Services &lt;/em&gt;entre l&amp;rsquo;application Silverlight et son site ASP.NET host.         &lt;br /&gt;
		&lt;a href="http://www.simonboigelot.com/image.axd?picture=clip_image004.jpg"&gt;&lt;img style="border-width: 0px; display: inline" src="http://www.simonboigelot.com/image.axd?picture=clip_image004_thumb.jpg" border="0" alt="clip_image004" title="clip_image004" width="244" height="217" /&gt;&lt;/a&gt; &lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Cliquez&lt;/em&gt; sur &lt;strong&gt;Ok&lt;/strong&gt;.         &lt;br /&gt;
		&lt;/li&gt;      
		&lt;li&gt;Visual Studio va g&amp;eacute;n&amp;eacute;rer automatiquement toute la structure de la solution. &lt;/li&gt;      
		&lt;li&gt;Dans le fichier &lt;strong&gt;MainPage.xaml&lt;/strong&gt; du projet Silverlight, ajouter un texte &amp;laquo; &lt;strong&gt;Hello World&lt;/strong&gt; &amp;raquo;.         
		&lt;p&gt;
		&lt;div class="code"&gt;
[code:xml]          &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="LayoutRoot"&lt;/span&gt; &lt;span class="attr"&gt;Background&lt;/span&gt;&lt;span class="kwrd"&gt;="White"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;           &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBlock&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;HelloWorld&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;TextBlock&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;           &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;           &lt;br /&gt;        [/code]&lt;/div&gt;
		&lt;/p&gt;
		     &lt;/li&gt;   
	&lt;/ul&gt;
	&lt;/li&gt;       
	&lt;li&gt;     
	&lt;p&gt;
	Voici le r&amp;eacute;sultat obtenu lors d&amp;rsquo;un d&amp;eacute;bogage de la solution cr&amp;eacute;e ci-dessus :
	&lt;/p&gt;
	&lt;a href="http://www.simonboigelot.com/image.axd?picture=clip_image006.jpg"&gt;&lt;img style="border-width: 0px; display: inline" src="http://www.simonboigelot.com/image.axd?picture=clip_image006_thumb.jpg" border="0" alt="clip_image006" title="clip_image006" width="244" height="155" /&gt;&lt;/a&gt;   &lt;/li&gt; 
&lt;/ul&gt;
  
&lt;h2&gt;Rendre cette application t&amp;eacute;l&amp;eacute;chargeable    &lt;br /&gt;
Gr&amp;acirc;ce au bouton fournit par la plateforme&lt;/h2&gt;  
&lt;p&gt;
Permettre &amp;agrave; vos utilisateurs d&amp;rsquo;installer votre application sur leurs machines se fait dans son fichier manifeste.
&lt;/p&gt;
  
&lt;p&gt;
Ce fichier se trouve dans le dossier &amp;laquo; &lt;strong&gt;Properties&lt;/strong&gt; &amp;raquo; de votre application.     &lt;br /&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=clip_image008.jpg"&gt;&lt;img style="border-width: 0px; display: inline" src="http://www.simonboigelot.com/image.axd?picture=clip_image008_thumb.jpg" border="0" alt="clip_image008" title="clip_image008" width="244" height="187" /&gt;&lt;/a&gt;
&lt;/p&gt;
  
&lt;p&gt;
Pour proc&amp;eacute;der, d&amp;eacute;commentez le n&amp;oelig;ud &amp;laquo;&lt;strong&gt;Deployement.ApplicationIdentity&lt;/strong&gt; &amp;raquo;. 
&lt;/p&gt;
  
&lt;div class="code"&gt;  
&lt;p&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; MainPage()    &lt;br /&gt;
{     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (App.Current.RunningOffline)     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebOrDeskTextBlock.Text = &amp;quot;Bureau&amp;quot;;     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DownAndInstallBtt.Visibility = Visibility.Collapsed;     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&lt;/span&gt;     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WebOrDeskTextBlock.Text = &amp;quot;Navigateur&amp;quot;;     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DownAndInstallBtt.Visibility = Visibility.Visible;     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }     &lt;br /&gt;
}
&lt;/p&gt;
   
&lt;/div&gt;  
&lt;h2&gt;D&amp;eacute;tecter si le pc est online ou offline&lt;/h2&gt;  
&lt;p&gt;
Dans le m&amp;ecirc;me &amp;eacute;tat d&amp;rsquo;esprit, il est utile de conna&amp;icirc;tre l&amp;rsquo;&amp;eacute;tat de la connexion internet de la machine sur laquelle tourne l&amp;rsquo;application.
&lt;/p&gt;
  
&lt;p&gt;
Mais dans ce cas-ci, le travail est un peu plus complexe. En effet, cette connexion n&amp;rsquo;a pas un &amp;eacute;tat statique, il est possible que son &amp;eacute;tat change durant l&amp;rsquo;ex&amp;eacute;cution de l&amp;rsquo;application.
&lt;/p&gt;
  
&lt;p&gt;
Un &amp;eacute;v&amp;egrave;nement est envoy&amp;eacute; &amp;agrave; l&amp;rsquo;application par la plateforme lorsque cela arrive. Il suffit donc de s&amp;rsquo;y abonner et de rev&amp;eacute;rifier l&amp;rsquo;&amp;eacute;tat de la connexion quand il est lanc&amp;eacute;.
&lt;/p&gt;
  
&lt;ul&gt;
	&lt;li&gt;&amp;nbsp;
	&lt;ul&gt;
		     
		&lt;li&gt;Ouvrez &lt;strong&gt;MainPage.xaml&lt;/strong&gt; dans le projet Silverlight. &lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Ajoutez&lt;/em&gt; une nouvelle &lt;em&gt;zone de texte&lt;/em&gt; et nommez-la &amp;laquo; &lt;strong&gt;OnOrOffTextBlock&lt;/strong&gt;&amp;raquo;         &lt;br /&gt;
		&lt;div class="code"&gt;
[code:xml]         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="LayoutRoot"&lt;/span&gt; &lt;span class="attr"&gt;Background&lt;/span&gt;&lt;span class="kwrd"&gt;="White"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;…&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;TextBlock&lt;/span&gt;         &lt;br /&gt;        &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="OnOrOffTextBlock"&lt;/span&gt;         &lt;br /&gt;        &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="5"&lt;/span&gt;         &lt;br /&gt;        &lt;span class="attr"&gt;Text&lt;/span&gt;&lt;span class="kwrd"&gt;="HelloWorld"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        [/code]&lt;/div&gt;         &lt;br /&gt;
		&lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Ouvrez&lt;/em&gt; &lt;strong&gt;MainPage.xaml.cs&lt;/strong&gt; &lt;/li&gt;      
		&lt;li&gt;Dans le constructeur de la page, juste apr&amp;egrave;s l&amp;rsquo;initialisation des composants, ajoutez ce code :        &lt;br /&gt;
		&lt;div class="code"&gt;
[code:c#]         &lt;br /&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; MainPage()         &lt;br /&gt;
        {         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;hellip;)         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; OnOrOff();         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; NetworkChange.NetworkAddressChanged +=         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; NetworkAddressChangedEventHandler         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (NetworkChange_NetworkAddressChanged);         &lt;br /&gt;
        }         &lt;br /&gt;
                &lt;br /&gt;
        &lt;span class="kwrd"&gt;void&lt;/span&gt; NetworkChange_NetworkAddressChanged(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender,         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EventArgs e)         &lt;br /&gt;
        {         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; OnOrOff();         &lt;br /&gt;
        }         &lt;br /&gt;
                &lt;br /&gt;
        &lt;span class="kwrd"&gt;void&lt;/span&gt; OnOrOff()         &lt;br /&gt;
        {         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (NetworkInterface.GetIsNetworkAvailable())         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; {         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnOrOffTextBlock.Text = &amp;quot;Online&amp;quot;;         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnOrOffTextBlock.Foreground = &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Green);         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; }         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&lt;/span&gt;         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; {         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnOrOffTextBlock.Text = &amp;quot;Offline&amp;quot;;         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnOrOffTextBlock.Foreground =&lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Red);         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; }         &lt;br /&gt;
        }         &lt;br /&gt;
        [/code]&lt;/div&gt; &lt;/li&gt;   
	&lt;/ul&gt;
	&lt;/li&gt;    
&lt;/ul&gt;
  
&lt;p&gt;
La fonction NetworkInterface.GetIsNetworkAvailable() retourne un bool&amp;eacute;en donnant cette information.
&lt;/p&gt;
  
&lt;p&gt;
Lorsque l&amp;rsquo;ordinateur client perd la connexion internet, l&amp;rsquo;application le remarque en quelques secondes.
&lt;/p&gt;
  
&lt;h2&gt;R&amp;eacute;cup&amp;eacute;rer des donn&amp;eacute;es &amp;agrave; partir du site h&amp;ocirc;te de l&amp;rsquo;application&lt;/h2&gt;  
&lt;p&gt;
Silverlight 3 et les .Net RIA Services simplifie grandement la vie fastidieuse des d&amp;eacute;veloppeurs. Auparavant, pour consommer des donn&amp;eacute;es d&amp;rsquo;un serveur dans une application Silverlight, la m&amp;eacute;thode la plus couramment utilis&amp;eacute;e &amp;eacute;tait de connecter cette application Silverlight &amp;agrave; un service WCF (Windows communication foundation) lui-m&amp;ecirc;me correctement configur&amp;eacute; pour que sa s&amp;eacute;curit&amp;eacute; lui permette de dialoguer avec l&amp;rsquo;application. *gasp* Rien que de le dire, ca fait mal.
&lt;/p&gt;
  
&lt;p&gt;
Aujourd&amp;rsquo;hui, le paradis nous ouvre ses portes. En effet, il est possible de cr&amp;eacute;er une communication entre un site ASP.NET et une application Silverlight 3 qu&amp;rsquo;il h&amp;eacute;berge, et ce, en quelque cliques mais tout en gardant une grande libert&amp;eacute; de configuration.
&lt;/p&gt;
  
&lt;p&gt;
Ainsi, la plateforme nous offre de la simplicit&amp;eacute;, sans nous faire payer en g&amp;eacute;n&amp;eacute;ricit&amp;eacute;.
&lt;/p&gt;
  
&lt;p&gt;
&amp;middot; Pour les besoin de la d&amp;eacute;mo, cr&amp;eacute;ons rapidement une petite base de donn&amp;eacute;es des employ&amp;eacute;s de Heode dont voici la structure :    &lt;br /&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=clip_image020.jpg"&gt;&lt;img style="border-width: 0px; display: inline" src="http://www.simonboigelot.com/image.axd?picture=clip_image020_thumb.jpg" border="0" alt="clip_image020" title="clip_image020" width="244" height="138" /&gt;&lt;/a&gt;
&lt;/p&gt;
  
&lt;ul&gt;
	&lt;li&gt;&amp;nbsp;
	&lt;ul&gt;
		     
		&lt;li&gt;Retournez dans &lt;strong&gt;Visual Studio&lt;/strong&gt; &lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Cliquez&lt;/em&gt; avec le &lt;em&gt;bouton droit&lt;/em&gt;&lt;strong&gt; &lt;/strong&gt;de la souris sur le projet &amp;laquo; &lt;strong&gt;OutOfBrowser.Web&lt;/strong&gt; &amp;raquo; (le site web ASP.NET) &lt;/li&gt;      
		&lt;li&gt;&lt;strong&gt;S&amp;eacute;lectionnez&lt;/strong&gt; le menu Add new &amp;agrave; new Item &amp;hellip; &lt;/li&gt;      
		&lt;li&gt;&lt;strong&gt;Dans la bo&amp;icirc;te de dialogue &amp;laquo; New Item &amp;raquo;, s&amp;eacute;lectionnez le &lt;em&gt;template&lt;/em&gt; &amp;laquo;&lt;/strong&gt; LINQ to SQL Classes &amp;raquo; et donnez lui le nom : &lt;strong&gt;SuperHeroDB&lt;/strong&gt;.         &lt;br /&gt;
		&lt;em&gt;&lt;font size="2" color="#ff8000"&gt;Les classes LINQ to SQL sont un moyen simple et rapide de vous connecter &amp;agrave; une base de donn&amp;eacute;es.&lt;/font&gt;&lt;/em&gt; &lt;/li&gt;      
		&lt;li&gt;Ouvrez le fichier SuperHeroDB.dbml &lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Naviguez&lt;/em&gt; dans &lt;em&gt;l&amp;rsquo;explorateur de serveur&lt;/em&gt; de Visual Studio jusqu&amp;rsquo;&amp;agrave; trouver la table &lt;strong&gt;SuperHero&lt;/strong&gt; et &lt;em&gt;glissez&lt;/em&gt; l&amp;agrave; sur la surface de dessin des classes &lt;strong&gt;LINQ to SQL&lt;/strong&gt;. &lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Compilez le projet ASP.NET&amp;nbsp; &lt;br /&gt;
		&lt;/em&gt;&lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;S&amp;eacute;lectionnez&lt;/em&gt; une foi de plus le menu &lt;strong&gt;Add new&lt;/strong&gt; &amp;agrave; &lt;strong&gt;new Item &amp;hellip;&lt;/strong&gt; &lt;/li&gt;      
		&lt;li&gt;Dans la bo&amp;icirc;te de dialogue &amp;laquo; &lt;strong&gt;New Item&lt;/strong&gt; &amp;raquo;, &lt;em&gt;s&amp;eacute;lectionnez&lt;/em&gt; le &lt;em&gt;template&lt;/em&gt; &amp;laquo; &lt;strong&gt;Domain Service&lt;/strong&gt; &amp;raquo; et donnez lui le nom : &lt;strong&gt;SuperHeroService&lt;/strong&gt;.         &lt;br /&gt;
		&lt;em&gt;&lt;font size="2" color="#ff8040"&gt;Un Domain Service est un service de donn&amp;eacute;es et d&amp;rsquo;op&amp;eacute;ration qui sera accessible au site web et &amp;agrave; tous ses composants internes. C&amp;rsquo;est &amp;agrave; travers ce service que le site web et l&amp;rsquo;application Silverlight vont communiquer.&lt;/font&gt;&lt;/em&gt; &lt;/li&gt;      
		&lt;li&gt;Cliquez sur Ok.        &lt;br /&gt;
		&lt;/li&gt;      
		&lt;li&gt;La bo&amp;icirc;te de dialogue suivante vous demande de s&amp;eacute;lectionnez &amp;agrave; quel acc&amp;egrave;s aux donn&amp;eacute;es vous voulez lier le Domain Service. Choisissez &lt;strong&gt;SuperHeroDB&lt;/strong&gt;, ensuite cochez l&amp;rsquo;option devant la table &lt;strong&gt;SuperHero&lt;/strong&gt;.         &lt;br /&gt;
		&lt;a href="http://www.simonboigelot.com/image.axd?picture=clip_image022.jpg"&gt;&lt;img style="border-width: 0px; display: inline" src="http://www.simonboigelot.com/image.axd?picture=clip_image022_thumb.jpg" border="0" alt="clip_image022" title="clip_image022" width="233" height="244" /&gt;&lt;/a&gt;         &lt;br /&gt;
		&lt;font size="2"&gt;&lt;font color="#ff8040"&gt;&lt;em&gt;Les autres options vous permettent de demander &amp;agrave; la plateforme de g&amp;eacute;n&amp;eacute;rer automatiquement toute l&amp;rsquo;op&amp;eacute;ration d&amp;rsquo;&amp;eacute;dition, d&amp;rsquo;insertion et de r&amp;eacute;solution de conflits mais nous n&amp;rsquo;en auront pas besoin dans cet exercice&lt;/em&gt;.&lt;/font&gt;&lt;/font&gt;&amp;nbsp; &lt;/li&gt;      
		&lt;li&gt;Cliquez sur &lt;strong&gt;Ok&lt;/strong&gt;. &lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Compilez la solution au complet.&lt;/em&gt; &lt;/li&gt;   
	&lt;/ul&gt;
	&lt;/li&gt;    
&lt;/ul&gt;
  
&lt;p&gt;
Vos donn&amp;eacute;es sont maintenant expos&amp;eacute;e par le site web aux clients Silverlight.
&lt;/p&gt;
  
&lt;ul&gt;
	&lt;li&gt;&amp;nbsp;
	&lt;ul&gt;
		     
		&lt;li&gt;Ajoutez la r&amp;eacute;f&amp;eacute;rence System.Windows.Controls.Data &amp;agrave; votre project Silverlight &lt;/li&gt;      
		&lt;li&gt;Ouvrez &lt;strong&gt;MainPage.xaml&lt;/strong&gt; dans le projet Silverlight. &lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Ajoutez&lt;/em&gt; une nouvelle &lt;em&gt;grille de donn&amp;eacute;es&lt;/em&gt; et nommez-la &amp;laquo; &lt;strong&gt;MaDataGrid&lt;/strong&gt;&amp;raquo;         &lt;br /&gt;
		&lt;div class="code"&gt;
[code:xml]         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;UserControl&lt;/span&gt; &lt;span class="attr"&gt;x:Class&lt;/span&gt;&lt;span class="kwrd"&gt;="OutOfBrowser.MainPage"&lt;/span&gt;         &lt;br /&gt;        &lt;span class="attr"&gt;xmlns&lt;/span&gt;=&lt;span class="attr"&gt;http:&lt;/span&gt;//&lt;span class="attr"&gt;schemas&lt;/span&gt;.&lt;span class="attr"&gt;microsoft&lt;/span&gt;.&lt;span class="attr"&gt;com&lt;/span&gt;/&lt;span class="attr"&gt;winfx&lt;/span&gt;/&lt;span class="attr"&gt;2006&lt;/span&gt;/&lt;span class="attr"&gt;xaml&lt;/span&gt;/&lt;span class="attr"&gt;presentation&lt;/span&gt;         &lt;br /&gt;        &lt;span class="attr"&gt;xmlns:x&lt;/span&gt;=&lt;span class="attr"&gt;http:&lt;/span&gt;//&lt;span class="attr"&gt;schemas&lt;/span&gt;.&lt;span class="attr"&gt;microsoft&lt;/span&gt;.&lt;span class="attr"&gt;com&lt;/span&gt;/&lt;span class="attr"&gt;winfx&lt;/span&gt;/&lt;span class="attr"&gt;2006&lt;/span&gt;/&lt;span class="attr"&gt;xaml&lt;/span&gt;         &lt;br /&gt;        &lt;span class="attr"&gt;xmlns:data&lt;/span&gt;&lt;span class="kwrd"&gt;="clr-namespace:System.Windows.Controls;assembly=          &lt;br /&gt;        System.Windows.Controls.Data"&lt;/span&gt;           &lt;br /&gt;        &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="400"&lt;/span&gt; &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="300"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt; &lt;span class="attr"&gt;x:Name&lt;/span&gt;&lt;span class="kwrd"&gt;="LayoutRoot"&lt;/span&gt; &lt;span class="attr"&gt;Background&lt;/span&gt;&lt;span class="kwrd"&gt;="White"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;data:DataGrid&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="MyDataGrid"&lt;/span&gt; &lt;span class="attr"&gt;Margin&lt;/span&gt;&lt;span class="kwrd"&gt;="5"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;          &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;…&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;StackPanel&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Grid&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;UserControl&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;         &lt;br /&gt;        [/code]&lt;/div&gt;         &lt;br /&gt;
		&lt;/li&gt;      
		&lt;li&gt;&lt;em&gt;Ouvrez&lt;/em&gt; &lt;strong&gt;MainPage.xaml.cs&lt;/strong&gt; &lt;/li&gt;      
		&lt;li&gt;Dans le constructeur de la page, juste apr&amp;egrave;s l&amp;rsquo;initialisation des composants, ajoutez ce code :        &lt;br /&gt;
		&lt;div class="code"&gt;
[code:c#]         &lt;br /&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; MainPage()         &lt;br /&gt;
        {         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;hellip;)         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; SuperHeroContext context = &lt;span class="kwrd"&gt;new&lt;/span&gt; SuperHeroContext();         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; MyDataGrid.ItemsSource = context.SuperHeros;         &lt;br /&gt;
        &amp;nbsp;&amp;nbsp;&amp;nbsp; context.LoadSuperHero();         &lt;br /&gt;
        }         &lt;br /&gt;
        [/code]&lt;/div&gt; &lt;/li&gt;   
	&lt;/ul&gt;
	&lt;/li&gt;    
&lt;/ul&gt;
  
&lt;p&gt;
Le r&amp;eacute;sultat est directement visible :
&lt;/p&gt;
  
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=clip_image024.jpg"&gt;&lt;img style="border-width: 0px; display: inline" src="http://www.simonboigelot.com/image.axd?picture=clip_image024_thumb.jpg" border="0" alt="clip_image024" title="clip_image024" width="244" height="231" /&gt;&lt;/a&gt;
&lt;/p&gt;
  
&lt;p&gt;
Cette m&amp;eacute;thode passionnante d&amp;rsquo;acc&amp;egrave;s aux donn&amp;eacute;es est bien plus compl&amp;egrave;te que le peu que je viens de vous montrer, pour les int&amp;eacute;resser je conseille grandement une lecture du document relatif aux .Net RIA Services disponible sur &lt;a href="http://www.silverlight.net/GetStarted/silverlight3"&gt;http://www.silverlight.net/GetStarted/silverlight3&lt;/a&gt;.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SimonBoigelotWorld/~4/pGnYWKMQQeY" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/SimonBoigelotWorld/~3/pGnYWKMQQeY/post.aspx</link>
      <author>simon.boigelot.nospam@nospam.heode.com (Togis)</author>
      <comments>http://www.simonboigelot.com/post/Silverlight-3-e28093-First-look.aspx#comment</comments>
      <guid isPermaLink="false">http://www.simonboigelot.com/post.aspx?id=95c4cf23-dcba-4464-a719-4e8b5be23a5b</guid>
      <pubDate>Tue, 07 Apr 2009 06:03:00 -0400</pubDate>
      <category>Publication</category>
      <category>Silverlight</category>
      <dc:publisher>Togis</dc:publisher>
      <pingback:server>http://www.simonboigelot.com/pingback.axd</pingback:server>
      <pingback:target>http://www.simonboigelot.com/post.aspx?id=95c4cf23-dcba-4464-a719-4e8b5be23a5b</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.simonboigelot.com/trackback.axd?id=95c4cf23-dcba-4464-a719-4e8b5be23a5b</trackback:ping>
      <wfw:comment>http://www.simonboigelot.com/post/Silverlight-3-e28093-First-look.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.simonboigelot.com/syndication.axd?post=95c4cf23-dcba-4464-a719-4e8b5be23a5b</wfw:commentRss>
    <feedburner:origLink>http://www.simonboigelot.com/post.aspx?id=95c4cf23-dcba-4464-a719-4e8b5be23a5b</feedburner:origLink></item>
    <item>
      <title>MDI Silverlight</title>
      <description>&lt;p&gt;
Dans l&amp;rsquo;optique de cr&amp;eacute;er un syst&amp;egrave;me de gestion multi-documents ou multi-fen&amp;ecirc;tres&amp;nbsp; &amp;agrave; l&amp;rsquo;int&amp;eacute;rieur d&amp;rsquo;une application Silverlight, il est utile de comprendre les base du drag and drop.
&lt;/p&gt;
&lt;p&gt;
Les &amp;eacute;l&amp;eacute;ments enfants d&amp;rsquo;un canvas sont dispos&amp;eacute; dans ce dernier gr&amp;acirc;ce &amp;agrave; 3 dependency properties.
&lt;/p&gt;
&lt;p&gt;
Ces propri&amp;eacute;t&amp;eacute;s sont :
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Canvas.Top : axe y&lt;/li&gt;    
	&lt;li&gt;Canvas.Left : axe x&lt;/li&gt;    
	&lt;li&gt;Canvas.ZIndex : axe z&lt;/li&gt; 
&lt;/ul&gt;
&lt;p&gt;
Pour modifier la valeur de ces propri&amp;eacute;t&amp;eacute; &amp;agrave; partir du code behind de l&amp;rsquo;application il faut utiliser la m&amp;eacute;thode :
&lt;/p&gt;
&lt;div class="code"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Canvas&lt;/span&gt; &lt;span class="attr"&gt;Background&lt;/span&gt;&lt;span class="kwrd"&gt;="LightBlue"&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="MDIRoot"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Canvas&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="MDI1"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Background&lt;/span&gt;&lt;span class="kwrd"&gt;="Silver"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="200"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="150"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Canvas&lt;/span&gt;.&lt;span class="attr"&gt;Left&lt;/span&gt;&lt;span class="kwrd"&gt;="50"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Canvas&lt;/span&gt;.&lt;span class="attr"&gt;Top&lt;/span&gt;&lt;span class="kwrd"&gt;="50"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Canvas&lt;/span&gt;.&lt;span class="attr"&gt;ZIndex&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;MouseLeftButtonDown&lt;/span&gt;&lt;span class="kwrd"&gt;="MDISelectCanvas"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;MouseLeftButtonUp&lt;/span&gt;&lt;span class="kwrd"&gt;="MDIUnselectCanvas"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;MouseLeave&lt;/span&gt;&lt;span class="kwrd"&gt;="MDILeaveCanvas"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Canvas&lt;/span&gt; &lt;span class="attr"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;="MDI2"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Background&lt;/span&gt;&lt;span class="kwrd"&gt;="Yellow"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Width&lt;/span&gt;&lt;span class="kwrd"&gt;="200"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Height&lt;/span&gt;&lt;span class="kwrd"&gt;="150"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Canvas&lt;/span&gt;.&lt;span class="attr"&gt;Left&lt;/span&gt;&lt;span class="kwrd"&gt;="100"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Canvas&lt;/span&gt;.&lt;span class="attr"&gt;Top&lt;/span&gt;&lt;span class="kwrd"&gt;="100"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;Canvas&lt;/span&gt;.&lt;span class="attr"&gt;ZIndex&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;MouseLeftButtonDown&lt;/span&gt;&lt;span class="kwrd"&gt;="MDISelectCanvas"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;MouseLeftButtonUp&lt;/span&gt;&lt;span class="kwrd"&gt;="MDIUnselectCanvas"&lt;/span&gt;    &lt;br /&gt;                    &lt;span class="attr"&gt;MouseLeave&lt;/span&gt;&lt;span class="kwrd"&gt;="MDILeaveCanvas"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Canvas&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;   &lt;/div&gt;&lt;p&gt;
&lt;div class="code"&gt;
[code:c#]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
Point? OrigineMDIMove;   
&lt;/p&gt;
&lt;p&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MDISelectCanvas(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, MouseButtonEventArgs e)   &lt;br /&gt;
{    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Canvas c = (Canvas)sender;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; OrigineMDIMove = e.GetPosition(MDIRoot);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; c.MouseMove += MDIMoveCanvas; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; c.SetValue(Canvas.ZIndexProperty,(Int32)   &lt;br /&gt;
&amp;nbsp;&amp;nbsp; MDIRoot.Children.Max(i=&amp;gt;i.GetValue(Canvas.ZIndexProperty))+1);    &lt;br /&gt;
} 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MDIUnselectCanvas(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, MouseButtonEventArgs e)   &lt;br /&gt;
{    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Canvas c = (Canvas)sender;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.MouseMove -= MDIMoveCanvas;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OrigineMDIMove = &lt;span class="kwrd"&gt;null&lt;/span&gt;;    &lt;br /&gt;
} 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MDIMoveCanvas(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, MouseEventArgs e)   &lt;br /&gt;
{    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!OrigineMDIMove.HasValue) &lt;span class="kwrd"&gt;return&lt;/span&gt;;    &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Canvas c = (Canvas)sender;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Point DestinationMDIMove = e.GetPosition(MDIRoot);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Point MDIMove = &lt;span class="kwrd"&gt;new&lt;/span&gt; Point()    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X = OrigineMDIMove.Value.X - DestinationMDIMove.X,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y = OrigineMDIMove.Value.Y - DestinationMDIMove.Y    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };    &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.SetValue(Canvas.TopProperty,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((&lt;span class="kwrd"&gt;double&lt;/span&gt;)c.GetValue(Canvas.TopProperty) - MDIMove.Y));    &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c.SetValue(Canvas.LeftProperty,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((&lt;span class="kwrd"&gt;double&lt;/span&gt;)c.GetValue(Canvas.LeftProperty) - MDIMove.X));    &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OrigineMDIMove = DestinationMDIMove;    &lt;br /&gt;
} 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; MDILeaveCanvas(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, MouseEventArgs e)   &lt;br /&gt;
{    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Canvas c = (Canvas)sender;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; c.MouseMove -= MDIMoveCanvas;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; OrigineMDIMove = &lt;span class="kwrd"&gt;null&lt;/span&gt;;    &lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
&amp;nbsp;&lt;a href="http://www.simonboigelot.com/image.axd?picture=image.png"&gt;&lt;img style="border: 0px none ; display: inline" src="http://www.simonboigelot.com/image.axd?picture=image_thumb.png" border="0" alt="image" title="image" width="244" height="240" /&gt;&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SimonBoigelotWorld/~4/-E4NT8cDtpE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/SimonBoigelotWorld/~3/-E4NT8cDtpE/post.aspx</link>
      <author>simon.boigelot.nospam@nospam.heode.com (Togis)</author>
      <comments>http://www.simonboigelot.com/post/MDI-Silverlight.aspx#comment</comments>
      <guid isPermaLink="false">http://www.simonboigelot.com/post.aspx?id=c5896418-0828-40c1-8379-7dcec777700e</guid>
      <pubDate>Fri, 27 Mar 2009 05:33:00 -0400</pubDate>
      <category>.NET 3.5</category>
      <category>Silverlight</category>
      <dc:publisher>Togis</dc:publisher>
      <pingback:server>http://www.simonboigelot.com/pingback.axd</pingback:server>
      <pingback:target>http://www.simonboigelot.com/post.aspx?id=c5896418-0828-40c1-8379-7dcec777700e</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.simonboigelot.com/trackback.axd?id=c5896418-0828-40c1-8379-7dcec777700e</trackback:ping>
      <wfw:comment>http://www.simonboigelot.com/post/MDI-Silverlight.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.simonboigelot.com/syndication.axd?post=c5896418-0828-40c1-8379-7dcec777700e</wfw:commentRss>
    <feedburner:origLink>http://www.simonboigelot.com/post.aspx?id=c5896418-0828-40c1-8379-7dcec777700e</feedburner:origLink></item>
    <item>
      <title>Créer une communication TCP IP entre Silverlight 2 et .Net 3.5</title>
      <description>&lt;p&gt;
Bien que Silverlight 2 permette des connexions HTTP (basicHTTP) vers un serveur WCF, l&amp;rsquo;envie peut nous prendre d&amp;rsquo;en vouloir plus.
&lt;/p&gt;
&lt;p&gt;
Pour pouvoir garder une connexion ouverte entre serveur et client, recevoir &amp;agrave; n&amp;rsquo;importe quel instant une donn&amp;eacute;e, du client au serveur, ou m&amp;ecirc;me du serveur au client, rien de mieux qu&amp;rsquo;une connexion TCP/IP.
&lt;/p&gt;
&lt;p&gt;
Dans cet article, nous allons voir pas &amp;agrave; pas comment cr&amp;eacute;er ce type de connexion ainsi que comment en rendre les assembly g&amp;eacute;n&amp;eacute;riques et r&amp;eacute;utilisables.
&lt;/p&gt;
&lt;p&gt;
Nous suivrons donc la route suivante :
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Comprendre TCP IP sous .Net      
	&lt;ol&gt;
		&lt;li&gt;Envoyer l&amp;rsquo;heure &amp;agrave; travers TCP IP &lt;/li&gt;     
	&lt;/ol&gt;
	&lt;/li&gt;    
	&lt;li&gt;Comprendre le policy-file-request de Silverlight      
	&lt;ol&gt;
		&lt;li&gt;Ajouter &amp;agrave; notre serveur un port &amp;eacute;coutant les requ&amp;ecirc;tes policy-file-request et y r&amp;eacute;pondant correctement &lt;/li&gt;     
	&lt;/ol&gt;
	&lt;/li&gt;    
	&lt;li&gt;Cr&amp;eacute;er un client TCP Silverlight 2      
	&lt;ol&gt;
		&lt;li&gt;Cr&amp;eacute;er un client TCP Silverlight qui lit un nombre primitif &lt;/li&gt;        
		&lt;li&gt;Utiliser des DataContract et un DataContractSerializer&lt;/li&gt;        
		&lt;li&gt;Comprendre les KnowTypes &lt;/li&gt;     
	&lt;/ol&gt;
	&lt;/li&gt;    
	&lt;li&gt;Rendre le tout g&amp;eacute;n&amp;eacute;rique et r&amp;eacute;utilisable (&lt;em&gt;article&amp;nbsp; pr&amp;eacute;view&lt;/em&gt;)&lt;/li&gt; 
&lt;/ol&gt;
[&lt;a href="http://www.simonboigelot.com/Tog_data/sl2TCP.rar" title="Sl2Tcp"&gt;Downloadez la solution complete de cette article ici&lt;/a&gt;]&lt;br /&gt;
&lt;h1&gt;1. Comprendre TCP IP sous .Net&lt;/h1&gt;  
&lt;p&gt;
La plateforme .Net offre sous le namespace System.Net.Sockets tous les outils n&amp;eacute;cessaire &amp;agrave; une cr&amp;eacute;ation facile de connexion TCP.
&lt;/p&gt;
&lt;p&gt;
Ainsi les deux objets suivants vont &amp;ecirc;tre utilis&amp;eacute; :
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;TcpListener&lt;/strong&gt; : sert &amp;agrave; ouvrir le port d&amp;rsquo;une machine en mode LISTEN. Des clients vont alors pouvoir s&amp;rsquo;y connecter. (Ceci se fait cot&amp;eacute; serveur)&lt;/li&gt;    
	&lt;li&gt;&lt;strong&gt;TcpClient&lt;/strong&gt; : sert autant du cot&amp;eacute; server que du cot&amp;eacute; client. Une foi connect&amp;eacute;, le client et le serveur se r&amp;eacute;f&amp;eacute;rence r&amp;eacute;ciproquement par un objet TcpClient donnant au programmeur un acc&amp;egrave;s facile au fonctions d&amp;rsquo;envoie de donn&amp;eacute;e, de gestion de la connexion, etc. &lt;/li&gt; 
&lt;/ol&gt;
&lt;p&gt;
Voici un serveur n&amp;rsquo;acceptant qu&amp;rsquo;un seul client, lui envoyant une donn&amp;eacute;e &lt;em&gt;(int data = 356)&lt;/em&gt; et se coupant ensuite.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;    &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net;     &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net.Sockets;     &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Threading; 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="kwrd"&gt;namespace&lt;/span&gt; testServer    &lt;br /&gt;
{     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;class&lt;/span&gt; Program     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Ce listener est utilis&amp;eacute; pour &amp;eacute;couter les     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// requ&amp;ecirc;tes de connexion de nouveaux clients     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TcpListener listener; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Ce client repr&amp;eacute;sente l&amp;#39;unique client Tcp     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// que nous allons accepter.     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// C&amp;#39;est gr&amp;acirc;ce &amp;agrave; cet object que nous allons     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// pouvoir envoyer une donn&amp;eacute;es au client     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TcpClient client; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AutoResetEvent OperationCompleted;    &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;internal&lt;/span&gt; Program()     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted = &lt;span class="kwrd"&gt;new&lt;/span&gt; AutoResetEvent(&lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;strong&gt; &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener = &lt;span class="kwrd"&gt;new&lt;/span&gt; TcpListener(IPAddress.Any, 5000);      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener.Start();       &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener.BeginAcceptSocket(OnClientConnected, &lt;span class="kwrd"&gt;null&lt;/span&gt;); &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted.WaitOne();    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnClientConnected(IAsyncResult param)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;int&lt;/span&gt; data = 356; &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client = listener.EndAcceptTcpClient(param);      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Client.Send(BitConverter.GetBytes(data));       &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Close();&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted.Set();    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; Program();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
} 
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Du cot&amp;eacute; client, c&amp;rsquo;est tout aussi simple :
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;    &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net.Sockets; 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="kwrd"&gt;namespace&lt;/span&gt; testClient    &lt;br /&gt;
{     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;class&lt;/span&gt; Program     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;internal&lt;/span&gt; Program()     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cr&amp;eacute;ation d&amp;rsquo;un buffer pour stocker les donn&amp;eacute;es re&amp;ccedil;ues    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//du server     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[&lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;)]; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;TcpClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; TcpClient();      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Connect(&amp;quot;localhost&amp;quot;, 5000);       &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Client.Receive(buffer);&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//conversion des donn&amp;eacute;es re&amp;ccedil;ues du serveur    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;int&lt;/span&gt; data = BitConverter.ToInt32(buffer, 0); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&amp;quot;Received : {0}&amp;quot;, data);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Read();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; Program();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }     &lt;br /&gt;
} 
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
&amp;nbsp;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter\CreerUneConTcpSl2\img1.png"&gt;&lt;img style="border-width: 0px; display: inline" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter\CreerUneConTcpSl2\img1_thumb.png" border="0" alt="image" title="image" width="244" height="125" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h2&gt;1.1 Envoyer l&amp;rsquo;heure &amp;agrave; travers TCP IP&lt;/h2&gt;  
&lt;p&gt;
Comme vous avez pu le constater, les seules choses qu&amp;rsquo;il est possible d&amp;rsquo;envoyer &amp;agrave; travers une connexion TCP IP sont des bytes.
&lt;/p&gt;
&lt;p&gt;
Pour pouvoir envoyer un objet plus complexe, tel qu&amp;rsquo;un DateTime, il va nous falloir le &amp;ldquo;s&amp;eacute;rialiser&amp;rdquo; avant l&amp;rsquo;envoie et le &amp;ldquo;d&amp;eacute;s&amp;eacute;rialiser&amp;rdquo; &amp;agrave; la r&amp;eacute;ception.
&lt;/p&gt;
&lt;p&gt;
La s&amp;eacute;rialisation est le proc&amp;eacute;der de transformation d&amp;rsquo;un objet en un tableau de byte. C&amp;rsquo;est en outre une bonne m&amp;eacute;thode pour sauvegarder des objets dans un fichier.
&lt;/p&gt;
&lt;p&gt;
Pour pouvoir &amp;ecirc;tre s&amp;eacute;rialis&amp;eacute;, la class d&amp;rsquo;un objet doit porter l&amp;rsquo;attribut &lt;strong&gt;ISerializable&lt;/strong&gt; ou un attribut qui en d&amp;eacute;rive. Vous trouverez facilement plus d&amp;rsquo;info sur cet attribut sur internet. &lt;em&gt;(Nous verrons plus tard que pour communiquer avec Silverlight l&amp;rsquo;attribut &amp;agrave; utiliser est DataContract)&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Les outils de s&amp;eacute;rialisation sont disponible dans le namespace System.Runtime.Serialization.
&lt;/p&gt;
&lt;p&gt;
Du cot&amp;eacute; server, il nous suffit de changer la fonction OnClientConnected :
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;void&lt;/span&gt; OnClientConnected(IAsyncResult param)    &lt;br /&gt;
{     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; client = listener.EndAcceptTcpClient(param); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Recup&amp;eacute;ration de l&amp;#39;heure    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime now = DateTime.Now; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cr&amp;eacute;ation d&amp;#39;un buffer temporaire dans lequel    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//on va s&amp;eacute;rialiser l&amp;#39;heure     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[100]; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Encapsulation du buffer dans un stream m&amp;eacute;moire    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//permetant ainsi une ecriture facile     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; MemoryStream stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(buffer); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cr&amp;eacute;ation d&amp;#39;un BinaryFormatter et S&amp;eacute;rialisation    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//de l&amp;#39;heure dans le stream -&amp;gt; donc dans le buffer     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; BinaryFormatter bf = &lt;span class="kwrd"&gt;new&lt;/span&gt; BinaryFormatter();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; bf.Serialize(stream, now); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Envoie du buffer au client    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Client.Send(buffer);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Close(); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted.Set();    &lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Le client, lui, r&amp;eacute;cup&amp;egrave;re le buffer et le d&amp;eacute;s&amp;eacute;rialise en DateTime, de la m&amp;ecirc;me fa&amp;ccedil;on.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;internal&lt;/span&gt; Program()    &lt;br /&gt;
{     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[100]; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; TcpClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; TcpClient();    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Connect(&amp;quot;localhost&amp;quot;, 5000);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Client.Receive(buffer);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; MemoryStream stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(buffer);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; BinaryFormatter bf = &lt;span class="kwrd"&gt;new&lt;/span&gt; BinaryFormatter();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime received = (DateTime)bf.Deserialize(stream); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&amp;quot;Received : {0}&amp;quot;, received.ToLongTimeString());    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Read();     &lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter\CreerUneConTcpSl2\img2.png"&gt;&lt;img style="border-width: 0px; display: inline" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter\CreerUneConTcpSl2\img2_thumb.png" border="0" alt="image" title="image" width="244" height="125" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h2&gt;1.2 Rappel&lt;/h2&gt;  
&lt;p&gt;
Nous avons :
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;cr&amp;eacute;er un server avec TcpLisener et TcpClient &lt;/li&gt;    
	&lt;li&gt;cr&amp;eacute;er un client avec TcpClient &lt;/li&gt;    
	&lt;li&gt;S&amp;eacute;rialiser et d&amp;eacute;s&amp;eacute;rialiser avec BinaryFormatter &lt;/li&gt; 
&lt;/ul&gt;
&lt;p&gt;
Nous n&amp;rsquo;avons pas envoy&amp;eacute; de donn&amp;eacute;e du client au server, mais le proc&amp;eacute;d&amp;eacute; est le m&amp;ecirc;me. Notez que vous pouvez envoyer et recevoir des donn&amp;eacute;es simultan&amp;eacute;ment sans risque de collision.
&lt;/p&gt;
&lt;p&gt;
Nous avons utiliser les fonction Send et Receive de fa&amp;ccedil;on synchrone, leur version asynchrone existe aussi et est beaucoup plus int&amp;eacute;ressant dans un sc&amp;eacute;nario r&amp;eacute;el.
&lt;/p&gt;
&lt;h1&gt;2. Comprendre le policy-file-request de Silverlight &lt;/h1&gt;  
&lt;p&gt;
Aie :s
&lt;/p&gt;
&lt;p&gt;
La s&amp;eacute;curit&amp;eacute;, le truc par excellence qui ne marche jamais du premier coup, surtout en Silverlight avec les policy-file.
&lt;/p&gt;
&lt;p&gt;
Commen&amp;ccedil;ons par le d&amp;eacute;but, pour changer. 
&lt;/p&gt;
&lt;p&gt;
Pour qu&amp;rsquo;un service WCF fonctionne avec des clients Silverlight, il doit poss&amp;eacute;der un fichier &lt;a href="http://timheuer.com/blog/archive/2008/04/06/silverlight-cross-domain-policy-file-snippet-intellisense.aspx"&gt;clientaccesspolicy.xml&lt;/a&gt;. Ce fichier permet de sp&amp;eacute;cifier &amp;agrave; partir de quel nom de domaine les applications Silverlight peuvent acc&amp;eacute;der a ce service.
&lt;/p&gt;
&lt;p&gt;
Si la plateforme Silverlight ne trouve pas ce fichier, elle va alors chercher son alter-ego Flash : crossdomain.xml.
&lt;/p&gt;
&lt;p&gt;
Pour vous &amp;eacute;vitez une recherche, voici le contenu d&amp;rsquo;un clientaccesspolicy.xml sp&amp;eacute;cifiant la s&amp;eacute;curit&amp;eacute; minimum : tout le monde peux utiliser ce service.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;    &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;     &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net;     &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net.Sockets;     &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;     &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Threading; 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="kwrd"&gt;namespace&lt;/span&gt; sl2Tcp    &lt;br /&gt;
{     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PolicyFileServer     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TcpListener listener;     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TcpClient client; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AutoResetEvent OperationCompleted; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Buffer servant &amp;agrave; sauvegarder le contenu du fichier    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//clientaccesspolicy.xml     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] PolicyByteArray; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Requ&amp;ecirc;te valide    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; PolicyRequestString = &amp;quot;&amp;lt;policy-file-request/&amp;gt;&amp;quot;; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Cr&amp;eacute;e une instance de PolicyFileServer dont     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// le fichier policy est situ&amp;eacute; sous le chemin     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// FilePath     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;FilePath&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; PolicyFileServer(&lt;span class="kwrd"&gt;string&lt;/span&gt; FilePath)     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener = &lt;span class="kwrd"&gt;new&lt;/span&gt; TcpListener(IPAddress.Any, 943);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted = &lt;span class="kwrd"&gt;new&lt;/span&gt; AutoResetEvent(&lt;span class="kwrd"&gt;false&lt;/span&gt;);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeData(FilePath);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Charge le fichier Policy dans PolicyByteArray     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;FilePath&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InitializeData(&lt;span class="kwrd"&gt;string&lt;/span&gt; FilePath)     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!File.Exists(FilePath))     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; IOException(&amp;quot;File not found : &amp;quot; + FilePath); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PolicyByteArray = File.ReadAllBytes(FilePath);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// D&amp;eacute;marre le thread principal du server     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; StartAsync()     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Thread T = &lt;span class="kwrd"&gt;new&lt;/span&gt; Thread(Start);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; T.Start();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Thread principal du server, ecoute les     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// requete de connexion sur le port 943     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Start()     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener.Start(); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;while&lt;/span&gt; (&lt;span class="kwrd"&gt;true&lt;/span&gt;)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener.BeginAcceptSocket(OnClientConnected, &lt;span class="kwrd"&gt;null&lt;/span&gt;);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted.WaitOne();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Lorsqu&amp;#39;une connexion est &amp;eacute;tablie sur le port 943 :     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;///&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Receptionne une requete et la compare &amp;agrave; PolicyRequestString     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;///&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Si similaire, envoie PolicyByteArray     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;param&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnClientConnected(IAsyncResult param)     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client = listener.EndAcceptTcpClient(param); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[PolicyRequestString.Length]; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Client.Receive(buffer);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;string&lt;/span&gt; request = Encoding.UTF8.GetString(buffer, 0, buffer.Length); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (StringComparer.InvariantCultureIgnoreCase.Compare(request,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PolicyRequestString) != 0)     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Client.Close();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted.Set();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;return&lt;/span&gt;;     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Envoie du buffer policy au client    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Client.Send(PolicyByteArray);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Close(); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted.Set();    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }     &lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Ce nouvel objet d&amp;eacute;finit, ajouter la gestion de la s&amp;eacute;curit&amp;eacute; Silverlight 2 &amp;agrave; un server devient un jeu d&amp;rsquo;enfant, rempla&amp;ccedil;ons le constructeur de notre serveur par :
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;internal&lt;/span&gt; Program()    &lt;br /&gt;
{     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; PolicyFileServer policyFileServer =     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; PolicyFileServer(@&amp;quot;..\..\..\PolicyFileHolder\clientaccesspolicy.xml&amp;quot;);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; policyFileServer.StartAsync(); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted = &lt;span class="kwrd"&gt;new&lt;/span&gt; AutoResetEvent(&lt;span class="kwrd"&gt;false&lt;/span&gt;); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; listener = &lt;span class="kwrd"&gt;new&lt;/span&gt; TcpListener(IPAddress.Any, 4502);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; listener.Start();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; listener.BeginAcceptSocket(OnClientConnected, &lt;span class="kwrd"&gt;null&lt;/span&gt;); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted.WaitOne();    &lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Avant de nous lancer dans l&amp;rsquo;&amp;eacute;criture d&amp;rsquo;un client en Silverlight 2, ajoutons &amp;agrave; notre client console un TcpClient suppl&amp;eacute;mentaire se connectant au PolicyFileServer. Nous pourrons ainsi v&amp;eacute;rifier son bon fonctionnement.
&lt;/p&gt;
&lt;p&gt;
Le code Program du client devient :
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;internal&lt;/span&gt; Program()    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[400]; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TcpClient sl2FakeFrameworrkClient = &lt;span class="kwrd"&gt;new&lt;/span&gt; TcpClient();    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sl2FakeFrameworrkClient.Connect(&amp;quot;localhost&amp;quot;, 943);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] PolicyRequestByteArray =     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Encoding.UTF8.GetBytes(PolicyRequestString);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sl2FakeFrameworrkClient.Client.Send(PolicyRequestByteArray);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sl2FakeFrameworrkClient.Client.Receive(buffer);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;string&lt;/span&gt; PolicyFileReceived = Encoding.UTF8.GetString(buffer);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&amp;quot;Received PolicyFile : \n{0}\n\n&amp;quot;,     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PolicyFileReceived); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Ici le framework va tester si l&amp;#39;application Silverlight    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//a le droit d&amp;#39;acceder au service Tcp, dans le cas echeant     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//la connexion sera coup&amp;eacute;e &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TcpClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; TcpClient();    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Connect(&amp;quot;localhost&amp;quot;, 4502);     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Client.Receive(buffer); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemoryStream stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(buffer);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BinaryFormatter bf = &lt;span class="kwrd"&gt;new&lt;/span&gt; BinaryFormatter();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime received = (DateTime)bf.Deserialize(stream); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&amp;quot;Received : {0}&amp;quot;, received.ToLongTimeString());    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.Read();     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter\CreerUneConTcpSl2\img3.png"&gt;&lt;img style="border-width: 0px; display: inline" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter\CreerUneConTcpSl2\img3_thumb.png" border="0" alt="image" title="image" width="244" height="125" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h1&gt;3. Cr&amp;eacute;er un client TCP Silverlight 2&lt;/h1&gt;  
&lt;p&gt;
La plateforme Silverlight 2 n&amp;rsquo;&amp;eacute;tant qu&amp;rsquo;un sous-ensemble de la plateforme .net, nous nous y retrouvons toujours le namespace System.Net.Sockets mais sans notre habituel TcpClient.
&lt;/p&gt;
&lt;p&gt;
Nous allons devoir retirer une couche d&amp;rsquo;abstraction &amp;agrave; notre programmation et utiliser le Socket de ce m&amp;ecirc;me namespace 
&lt;/p&gt;
&lt;p&gt;
Qui plus est, en Silverlight 2, toute communication doit &amp;ecirc;tre asynchrone.
&lt;/p&gt;
&lt;h2&gt;3.1 Cr&amp;eacute;er un client TCP Silverlight qui lit un nombre primitif&lt;/h2&gt;  
&lt;p&gt;
L&amp;rsquo;objet Socket ne garantit pas que sa fonction ReceiveAsync lise bel et bien le nombre de bytes qu&amp;rsquo;on lui a demande en param&amp;egrave;tre.
&lt;/p&gt;
&lt;p&gt;
C&amp;rsquo;est pourquoi le programmeur se doit de v&amp;eacute;rifier que toutes les donn&amp;eacute;es dont il a besoin ont bien &amp;eacute;t&amp;eacute; lue par le Socket avant d&amp;rsquo;essayer de les exploiter.
&lt;/p&gt;
&lt;p&gt;
Pour ce faire, les arguments de l&amp;rsquo;&amp;eacute;v&amp;egrave;nement OnCompleted du Socket contiennent une propri&amp;eacute;t&amp;eacute; : BytesTransferred.
&lt;/p&gt;
&lt;p&gt;
BytesTransferred repr&amp;eacute;sente le nombre de bytes effectivement lus par ReceiveAsync. Si ce nombre de bytes est insuffisant pour le programmeur, il faut alors relancer la fonction ReceiveAsync.
&lt;/p&gt;
&lt;p&gt;
Une deuxi&amp;egrave;me subtilit&amp;eacute; est &amp;agrave; prendre en compte avec la fonction ReceiveAsync : cette fonction retourne un bool&amp;eacute;en.
&lt;/p&gt;
&lt;p&gt;
Lorsque ce bool&amp;eacute;en est vrai, le framework &amp;agrave; d&amp;eacute;cider d&amp;rsquo;ex&amp;eacute;cuter ReceiveAsync de mani&amp;egrave;re asynchrone et un appel &amp;agrave; l&amp;rsquo;&amp;eacute;v&amp;egrave;nement Socket.OnCompleted sera lancer.
&lt;/p&gt;
&lt;p&gt;
Par contre, lorsque ce bool&amp;eacute;en est faux, la plateforme &amp;agrave; d&amp;eacute;cider d&amp;rsquo;&amp;eacute;x&amp;eacute;cuter ReceiveAsync de mani&amp;egrave;re synchrone et l&amp;rsquo;&amp;eacute;v&amp;egrave;nement Socket.OnCompleted ne sera pas lanc&amp;eacute;, il nous faudra alors nous en charger nous m&amp;ecirc;me.
&lt;/p&gt;
&lt;p&gt;
Voici le code d&amp;rsquo;une class g&amp;eacute;rant une connexion Tcp cliente Silverlight 2 :
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;   &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net;    &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net.Sockets; 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="kwrd"&gt;namespace&lt;/span&gt; sl2NumberClient   &lt;br /&gt;
{    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Del&amp;eacute;g&amp;eacute; servant pour l&amp;#39;event OnDataReceived de sl2Client    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;ReceivedData&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; sl2ClientEventHandler(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, &lt;span class="kwrd"&gt;int&lt;/span&gt; ReceivedData); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; sl2Client   &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Lorqu&amp;#39;une donn&amp;eacute;e est recue par un client, il ex&amp;eacute;cute    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// ce d&amp;eacute;l&amp;eacute;gu&amp;eacute; pour propager cette donn&amp;eacute;es &amp;agrave; ses abonn&amp;eacute;s    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; sl2ClientEventHandler OnDataReceived; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Socket socket;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[&lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;)]; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Nombre de bytes commul&amp;eacute; lu par les appels   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//successif de Socket.ReceiveAsyn(...)    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;int&lt;/span&gt; bytesRead = 0; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Start()   &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cr&amp;eacute;ation du socket client Tcp    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket =    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; Socket(AddressFamily.InterNetwork,     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SocketType.Stream,     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProtocolType.Tcp); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cr&amp;eacute;ation du EndPoint   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Le endpoint est l&amp;#39;adresse ip:port du serveur    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//utilisez &amp;#39;Application.Current.Host.Source.DnsSafeHost&amp;#39;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//&amp;agrave; la place de localhost en mode production    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DnsEndPoint ep =     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; DnsEndPoint(    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;localhost&amp;quot;,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4502); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cr&amp;eacute;ation des param&amp;egrave;tre de connexion   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cet EventArgs sera utilis&amp;eacute; tout au long de la    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//communication serveur-client    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SocketAsyncEventArgs ConnectionParam =    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; SocketAsyncEventArgs()    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RemoteEndPoint = ep    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Lorsque la connexion au serveur r&amp;eacute;usit ou   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//echoue, ex&amp;eacute;cuter la fonction &amp;#39;OnConnected&amp;#39;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionParam.Completed += OnConnected; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Se connecter au server d&amp;eacute;finit dans les params   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.ConnectAsync(ConnectionParam);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnConnected(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SocketAsyncEventArgs ConnectionParam)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//L&amp;#39;enumeration SocketError repr&amp;eacute;sente l&amp;#39;&amp;eacute;tat de la    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//connexion. SocketError.Success signifie que la     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//connexion &amp;agrave; &amp;eacute;t&amp;eacute;e &amp;eacute;tablie ET que les autorisations du    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//PolicyFile sont correctes    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (ConnectionParam.SocketError == SocketError.Success)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionParam.Completed -= OnConnected;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionParam.Completed += SocketOperationCompleted; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Commencer &amp;agrave; lire des donn&amp;eacute;es sur le flux Tcp   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; readMoreData(ConnectionParam);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&lt;/span&gt;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&amp;quot;Connection fault : &amp;quot; +     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionParam.SocketError);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;void&lt;/span&gt; readMoreData(SocketAsyncEventArgs ConnectionParam)   &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionParam.SetBuffer(buffer,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bytesRead,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (buffer.Length - bytesRead));    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;try&lt;/span&gt;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Subitilit&amp;eacute; num&amp;eacute;ro 2    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (socket.ReceiveAsync(ConnectionParam))    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SocketOperationCompleted(socket, ConnectionParam);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;catch&lt;/span&gt; (InvalidOperationException)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Tentative de lancer un ReveiveAsync alors qu&amp;#39;un    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//autre est d&amp;eacute;j&amp;agrave; en cours --&amp;gt; on s&amp;#39;en moque :D    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&amp;quot;readMoreData faild&amp;quot;, ex);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;void&lt;/span&gt; SocketOperationCompleted(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SocketAsyncEventArgs ConnectionParam)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (ConnectionParam.BytesTransferred &amp;gt; 0)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bytesRead += ConnectionParam.BytesTransferred; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//subtilit&amp;eacute; num&amp;eacute;ro 1   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (bytesRead &amp;gt;= buffer.Length)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;int&lt;/span&gt; ReceivedData = BitConverter.ToInt32(buffer, 0);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (OnDataReceived != &lt;span class="kwrd"&gt;null&lt;/span&gt;)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnDataReceived(&lt;span class="kwrd"&gt;this&lt;/span&gt;, ReceivedData);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.Close();    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&lt;/span&gt;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; readMoreData(ConnectionParam);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }   &lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Je passe la d&amp;eacute;finition de l&amp;rsquo;interface et de son code behind qui n&amp;rsquo;ont dans le cadre de cet article aucun int&amp;eacute;r&amp;ecirc;t. Si vous &amp;ecirc;tes toute foi demandeur &amp;agrave; ce sujet, vous les trouverez tout deux dans les code sources fournit avec cet article.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter\CreerUneConTcpSl2\img4.png"&gt;&lt;img style="border: 0px none ; display: inline" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter\CreerUneConTcpSl2\img4_thumb.png" border="0" alt="image" title="image" width="244" height="243" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h2&gt;3.2 Utiliser des DataContract et un DataContractSerializer&lt;/h2&gt;  
&lt;p&gt;
Dans le point 1.1 de cet article, nous avons envoyer l&amp;rsquo;heure par DateTime &amp;agrave; travers une connexion Tcp entre deux client .Net 3.5.
&lt;/p&gt;
&lt;p&gt;
Pour ce faire, nous avons utiliser un &lt;strong&gt;BinaryFormatter&lt;/strong&gt; s&amp;eacute;rialisant l&amp;rsquo;objet DateTime poss&amp;eacute;dant l&amp;rsquo;attribut &lt;strong&gt;ISerializable&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Les &lt;strong&gt;BinaryFormatter&lt;/strong&gt; ne sont pas disponible en Silverlight 2.
&lt;/p&gt;
&lt;p&gt;
Pour pouvoir s&amp;eacute;rialiser des objets sur le flux Tcp il faut utiliser un &lt;strong&gt;DataContractSerializer&lt;/strong&gt; s&amp;eacute;rialisant des objet poss&amp;eacute;dant l&amp;rsquo;attribut &lt;strong&gt;DataContract&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
DateTime poss&amp;egrave;de l&amp;rsquo;attribut DataContract, tout comme il poss&amp;egrave;de ISerializable.
&lt;/p&gt;
&lt;p&gt;
Cette modification de BinaryFormatter &amp;agrave; DataContractSerializer est &amp;agrave; faire cot&amp;eacute; client, mais aussi cot&amp;eacute; serveur.
&lt;/p&gt;
&lt;p&gt;
Une derni&amp;egrave;re subtilit&amp;eacute; est &amp;agrave; comprendre, le r&amp;eacute;sultat d&amp;rsquo;une s&amp;eacute;rialisation par DataContractSerializer est un tableau de bytes &lt;strong&gt;de taille variable&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Du cot&amp;eacute; client, il est impossible de savoir &amp;agrave; l&amp;rsquo;avance combien de bytes nous devront lire avant de pouvoir d&amp;eacute;s&amp;eacute;rialiser.
&lt;/p&gt;
&lt;p&gt;
Nous allons donc envoyer un nombre (UInt32) du serveur au client avant l&amp;rsquo;envoie du DateTime, Ce nombre sp&amp;eacute;cifiera la taille prise par le DateTime s&amp;eacute;rialis&amp;eacute;.
&lt;/p&gt;
&lt;p&gt;
Nous allons donc devoir modifier la fonction OnClientConnected notre serveur du point 2.1 de cet article :
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;(Notez que dans ce cas, les fonctions de s&amp;eacute;rialisation ne sont plus Serialize et Deserialize mais WriteObject et ReadObject)&lt;/em&gt;
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;void&lt;/span&gt; OnClientConnected(IAsyncResult param)   &lt;br /&gt;
{    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; client = listener.EndAcceptTcpClient(param); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Recup&amp;eacute;ration de l&amp;#39;heure   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime now = DateTime.Now; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Encapsulation du buffer dans un stream   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//permetant ainsi une ecriture facile    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; MemoryStream stream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cr&amp;eacute;ation d&amp;#39;un DataContractSerializer et S&amp;eacute;rialisation   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//de l&amp;#39;heure dans le stream --&amp;gt; donc dans le buffer    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DataContractSerializer dc =     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; DataContractSerializer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DateTime));    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.WriteObject(stream, now); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//R&amp;eacute;cup&amp;eacute;ration du buffer g&amp;eacute;n&amp;eacute;r&amp;eacute; dans le M&amp;eacute;moryStream   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = stream.ToArray(); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Evoie de la taille du buffer au client   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Client.Send(    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BitConverter.GetBytes(    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Int32)buffer.Length    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Envoie du buffer au client   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Client.Send(buffer);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; client.Close(); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted.Set();   &lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Le client, doit alors :
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Cr&amp;eacute;er un Socket Tcp&lt;/li&gt;    
	&lt;li&gt;Lire la taille du DateTime S&amp;eacute;rialiser&lt;/li&gt;    
	&lt;li&gt;Lire le DateTime&lt;/li&gt; 
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;p&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System;   &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net;    &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net.Sockets;    &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.Serialization;    &lt;br /&gt;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO; 
&lt;/p&gt;
&lt;p&gt;
&lt;span class="kwrd"&gt;namespace&lt;/span&gt; sl2DateTimeClient   &lt;br /&gt;
{    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Del&amp;eacute;g&amp;eacute; servant pour l&amp;#39;event OnDataReceived de sl2Client    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;ReceivedData&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; sl2ClientEventHandler(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, DateTime ReceivedData); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; sl2Client   &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// Lorqu&amp;#39;une donn&amp;eacute;e est recue par un client, il ex&amp;eacute;cute    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// ce d&amp;eacute;l&amp;eacute;gu&amp;eacute; pour propager cette donn&amp;eacute;es &amp;agrave; ses abonn&amp;eacute;s    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; sl2ClientEventHandler OnDataReceived; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Socket socket;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[&lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(UInt32)]; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Nombre de bytes commul&amp;eacute; lu par les appels   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//successif de Socket.ReceiveAsyn(...)    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;int&lt;/span&gt; bytesRead = 0; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Start()   &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cr&amp;eacute;ation du socket client Tcp    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket =    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; Socket(AddressFamily.InterNetwork,     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SocketType.Stream,     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProtocolType.Tcp); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cr&amp;eacute;ation du EndPoint   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Le endpoint est l&amp;#39;adresse ip:port du serveur    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//utilisez &amp;#39;Application.Current.Host.Source.DnsSafeHost&amp;#39;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//&amp;agrave; la place de localhost en mode production    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DnsEndPoint ep =     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; DnsEndPoint(    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;localhost&amp;quot;,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4502); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cr&amp;eacute;ation des param&amp;egrave;tre de connexion   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Cet EventArgs sera utilis&amp;eacute; tout au long de la    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//communication serveur-client    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SocketAsyncEventArgs ConnectionParam =    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; SocketAsyncEventArgs()    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RemoteEndPoint = ep    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Lorsque la connexion au serveur r&amp;eacute;usit ou   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//echoue, ex&amp;eacute;cuter la fonction &amp;#39;OnConnected&amp;#39;    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionParam.Completed += OnConnected; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Se connecter au server d&amp;eacute;finit dans les params   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.ConnectAsync(ConnectionParam);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnConnected(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SocketAsyncEventArgs ConnectionParam)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//L&amp;#39;enumeration SocketError repr&amp;eacute;sente l&amp;#39;&amp;eacute;tat de la    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//connexion. SocketError.Success signifie que la     &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//connexion &amp;agrave; &amp;eacute;t&amp;eacute;e &amp;eacute;tablie ET que les autorisations du    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//PolicyFile sont correctes    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (ConnectionParam.SocketError == SocketError.Success)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionParam.Completed -= OnConnected;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionParam.Completed += SocketOperationCompleted; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Commencer &amp;agrave; lire des donn&amp;eacute;es sur le flux Tcp   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; readMoreData(ConnectionParam);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&lt;/span&gt;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&amp;quot;Connection fault : &amp;quot; +     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionParam.SocketError);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;void&lt;/span&gt; readMoreData(SocketAsyncEventArgs ConnectionParam)   &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ConnectionParam.SetBuffer(buffer,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bytesRead,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (buffer.Length - bytesRead));    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;try&lt;/span&gt;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Subitilit&amp;eacute; num&amp;eacute;ro 2    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (socket.ReceiveAsync(ConnectionParam))    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SocketOperationCompleted(socket, ConnectionParam);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;catch&lt;/span&gt; (InvalidOperationException)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Tentative de lancer un ReveiveAsync alors qu&amp;#39;un    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//autre est d&amp;eacute;j&amp;agrave; en cours --&amp;gt; on s&amp;#39;en moque :D    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&amp;quot;readMoreData faild&amp;quot;, ex);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;void&lt;/span&gt; SocketOperationCompleted(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender,    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SocketAsyncEventArgs ConnectionParam)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (ConnectionParam.BytesTransferred &amp;gt; 0)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bytesRead += ConnectionParam.BytesTransferred; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//subtilit&amp;eacute; num&amp;eacute;ro 1   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (bytesRead &amp;gt;= buffer.Length)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt;(buffer.Length == &lt;span class="kwrd"&gt;sizeof&lt;/span&gt;(UInt32))    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Lire la taille de DataTime S&amp;eacute;rialiser    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//qui va suivre dans le flux    &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;int&lt;/span&gt; bufferSize = BitConverter.ToInt32(buffer,0); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//R&amp;eacute;initialiser le buffer   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[bufferSize];    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bytesRead = 0; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//Recommencer la lecture du flux   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; readMoreData(ConnectionParam);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&lt;/span&gt;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataContractSerializer dc =     &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; DataContractSerializer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DateTime)); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//D&amp;eacute;s&amp;eacute;rialiser le DateTime   &lt;br /&gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime ReceivedData = (DateTime)    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dc.ReadObject(&lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(buffer)); 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (OnDataReceived != &lt;span class="kwrd"&gt;null&lt;/span&gt;)   &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnDataReceived(&lt;span class="kwrd"&gt;this&lt;/span&gt;, ReceivedData);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; socket.Close();    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;else&lt;/span&gt;    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; readMoreData(ConnectionParam);    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }    &lt;br /&gt;
}
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter\CreerUneConTcpSl2\img5.png"&gt;&lt;img style="border: 0px none ; display: inline" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter\CreerUneConTcpSl2\img5_thumb.png" border="0" alt="image" title="image" width="244" height="241" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;h2&gt;3.3 Comprendre les KnowTypes&lt;/h2&gt;  
&lt;p&gt;
Le DataContractSerializer du point pr&amp;eacute;c&amp;eacute;dent ne s&amp;eacute;rialise que des DateTime.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
DataContractSerializer dc =&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; DataContractSerializer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DateTime)); 
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Si vous essayer de lui demander de s&amp;eacute;rialiser un autre DataContract, une exception sera lev&amp;eacute;e.
&lt;/p&gt;
&lt;p&gt;
En effet, le DataContractSerializer ne peut convertir en bytes que ce qu&amp;rsquo;il connait. Pour lui apprendre de nouveaux DataContract, il faut lui en passer les types en param&amp;egrave;tre lors de sa construction.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;p&gt;
DataContractSerializer bf =&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;new&lt;/span&gt; DataContractSerializer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;object&lt;/span&gt;),    &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; une List&amp;lt;Type&amp;gt;);
&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;
Cette List&amp;lt;Type&amp;gt; est appel&amp;eacute;e la liste des &lt;strong&gt;KnowTypes&lt;/strong&gt;.
&lt;/p&gt;
&lt;h1&gt;4. Rendre le tout g&amp;eacute;n&amp;eacute;rique et r&amp;eacute;utilisable &lt;/h1&gt;  
&lt;p&gt;
Dans mon prochain article nous verrons comment cr&amp;eacute;er une librairie r&amp;eacute;utilisable pour g&amp;eacute;rer toutes ces manipulations r&amp;eacute;p&amp;eacute;titives.
&lt;/p&gt;
&lt;p&gt;
Nous verrons aussi comment permettre &amp;agrave; une assembly d&amp;rsquo;&amp;ecirc;tre partag&amp;eacute;e (en r&amp;eacute;f&amp;eacute;rence) entre .Net 3.5 et Silverlight. Ceci est tr&amp;egrave;s utile pour la cr&amp;eacute;ation de notre propre class ayant l&amp;rsquo;attribut DataContract.
&lt;/p&gt;
&lt;p&gt;
Nous apprivoiserons correctement les possibilit&amp;eacute; duplex de ce type de connexion Tcp.
&lt;/p&gt;
&lt;p&gt;
Et enfin, nous utiliserons le tout pour cr&amp;eacute;er un petit chat en Silverlight.
&lt;/p&gt;
&lt;p&gt;
En esp&amp;eacute;rant que cette lecture vous aura &amp;eacute;t&amp;eacute; utile.
&lt;/p&gt;
&lt;p&gt;
Merci.   &lt;br /&gt;
Simon Boigelot.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Source :    &lt;br /&gt;
&lt;a href="http://khason.net/blog/networking-raw-sockets-in-silverlight-and-wpf-messaging-in-general/"&gt;Tamir Khason &amp;ndash; Just Code&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SimonBoigelotWorld/~4/bE2_qKYHShk" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/SimonBoigelotWorld/~3/bE2_qKYHShk/post.aspx</link>
      <author>simon.boigelot.nospam@nospam.heode.com (Togis)</author>
      <comments>http://www.simonboigelot.com/post/Creer-une-communication-TCP-IP-entre-Silverlight-2-et-Net-35.aspx#comment</comments>
      <guid isPermaLink="false">http://www.simonboigelot.com/post.aspx?id=88f2b2f3-0621-45fa-9d06-22a108bca1a3</guid>
      <pubDate>Thu, 19 Mar 2009 07:57:00 -0400</pubDate>
      <category>.NET 3.5</category>
      <category>General</category>
      <category>Silverlight</category>
      <category>WCF</category>
      <dc:publisher>Togis</dc:publisher>
      <pingback:server>http://www.simonboigelot.com/pingback.axd</pingback:server>
      <pingback:target>http://www.simonboigelot.com/post.aspx?id=88f2b2f3-0621-45fa-9d06-22a108bca1a3</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.simonboigelot.com/trackback.axd?id=88f2b2f3-0621-45fa-9d06-22a108bca1a3</trackback:ping>
      <wfw:comment>http://www.simonboigelot.com/post/Creer-une-communication-TCP-IP-entre-Silverlight-2-et-Net-35.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.simonboigelot.com/syndication.axd?post=88f2b2f3-0621-45fa-9d06-22a108bca1a3</wfw:commentRss>
    <enclosure url="http://www.simonboigelot.com/Tog_data/sl2TCP.rar" length="262338" type="application/octet-stream" /><media:content url="http://www.simonboigelot.com/Tog_data/sl2TCP.rar" fileSize="262338" type="application/octet-stream" /><itunes:explicit>no</itunes:explicit><itunes:subtitle> Bien que Silverlight 2 permette des connexions HTTP (basicHTTP) vers un serveur WCF, l&amp;rsquo;envie peut nous prendre d&amp;rsquo;en vouloir plus. Pour pouvoir garder une connexion ouverte entre serveur et client, recevoir &amp;agrave; n&amp;rsquo;importe quel instan</itunes:subtitle><itunes:author>simon.boigelot.nospam@nospam.heode.com (Togis)</itunes:author><itunes:summary> Bien que Silverlight 2 permette des connexions HTTP (basicHTTP) vers un serveur WCF, l&amp;rsquo;envie peut nous prendre d&amp;rsquo;en vouloir plus. Pour pouvoir garder une connexion ouverte entre serveur et client, recevoir &amp;agrave; n&amp;rsquo;importe quel instant une donn&amp;eacute;e, du client au serveur, ou m&amp;ecirc;me du serveur au client, rien de mieux qu&amp;rsquo;une connexion TCP/IP. Dans cet article, nous allons voir pas &amp;agrave; pas comment cr&amp;eacute;er ce type de connexion ainsi que comment en rendre les assembly g&amp;eacute;n&amp;eacute;riques et r&amp;eacute;utilisables. Nous suivrons donc la route suivante : Comprendre TCP IP sous .Net Envoyer l&amp;rsquo;heure &amp;agrave; travers TCP IP Comprendre le policy-file-request de Silverlight Ajouter &amp;agrave; notre serveur un port &amp;eacute;coutant les requ&amp;ecirc;tes policy-file-request et y r&amp;eacute;pondant correctement Cr&amp;eacute;er un client TCP Silverlight 2 Cr&amp;eacute;er un client TCP Silverlight qui lit un nombre primitif Utiliser des DataContract et un DataContractSerializer Comprendre les KnowTypes Rendre le tout g&amp;eacute;n&amp;eacute;rique et r&amp;eacute;utilisable (article&amp;nbsp; pr&amp;eacute;view) [Downloadez la solution complete de cette article ici] 1. Comprendre TCP IP sous .Net La plateforme .Net offre sous le namespace System.Net.Sockets tous les outils n&amp;eacute;cessaire &amp;agrave; une cr&amp;eacute;ation facile de connexion TCP. Ainsi les deux objets suivants vont &amp;ecirc;tre utilis&amp;eacute; : TcpListener : sert &amp;agrave; ouvrir le port d&amp;rsquo;une machine en mode LISTEN. Des clients vont alors pouvoir s&amp;rsquo;y connecter. (Ceci se fait cot&amp;eacute; serveur) TcpClient : sert autant du cot&amp;eacute; server que du cot&amp;eacute; client. Une foi connect&amp;eacute;, le client et le serveur se r&amp;eacute;f&amp;eacute;rence r&amp;eacute;ciproquement par un objet TcpClient donnant au programmeur un acc&amp;egrave;s facile au fonctions d&amp;rsquo;envoie de donn&amp;eacute;e, de gestion de la connexion, etc. Voici un serveur n&amp;rsquo;acceptant qu&amp;rsquo;un seul client, lui envoyant une donn&amp;eacute;e (int data = 356) et se coupant ensuite. using System; using System.Net; using System.Net.Sockets; using System.Threading; namespace testServer { &amp;nbsp;&amp;nbsp;&amp;nbsp; class Program &amp;nbsp;&amp;nbsp;&amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Ce listener est utilis&amp;eacute; pour &amp;eacute;couter les &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// requ&amp;ecirc;tes de connexion de nouveaux clients &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TcpListener listener; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Ce client repr&amp;eacute;sente l&amp;#39;unique client Tcp &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// que nous allons accepter. &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// C&amp;#39;est gr&amp;acirc;ce &amp;agrave; cet object que nous allons &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// pouvoir envoyer une donn&amp;eacute;es au client &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TcpClient client; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AutoResetEvent OperationCompleted; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; internal Program() &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted = new AutoResetEvent(false); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener = new TcpListener(IPAddress.Any, 5000); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener.Start(); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listener.BeginAcceptSocket(OnClientConnected, null); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OperationCompleted.WaitOne(); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void OnClientConnected(IAsyncResult pa</itunes:summary><itunes:keywords>.NET 3.5, General, Silverlight, WCF</itunes:keywords><feedburner:origLink>http://www.simonboigelot.com/post.aspx?id=88f2b2f3-0621-45fa-9d06-22a108bca1a3</feedburner:origLink></item>
    <item>
      <title>Blog Update</title>
      <description>&lt;p&gt;
Bonjour &amp;agrave; tous,
&lt;/p&gt;
&lt;p&gt;
J&amp;#39;ai eu un l&amp;eacute;g&amp;eacute; probl&amp;egrave;me lors de la mise &amp;agrave; jour de mon blog. Pour super r&amp;eacute;sultat, je viens de perdre mes posts du mois pass&amp;eacute;.
&lt;/p&gt;
&lt;p&gt;
Enfin... il sont toujours en backup ^^ Mais ne sont plus compatible avec cette nouvelle version de mon blog.&lt;br /&gt;
Je les transforme d&amp;eacute;s demain, et vous les rend.
&lt;/p&gt;
&lt;p&gt;
Quelques erreurs de style sont encore pr&amp;eacute;sente dans cette nouvelle version, mais cel&amp;agrave; ne devrait plus durer longtemps, merci de votre compr&amp;eacute;hension.
&lt;/p&gt;
&lt;p&gt;
Bien &amp;agrave; vous,&lt;br /&gt;
Simon Boigelot.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SimonBoigelotWorld/~4/RBMU63Cg2BU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/SimonBoigelotWorld/~3/RBMU63Cg2BU/post.aspx</link>
      <author>simon.boigelot.nospam@nospam.heode.com (Togis)</author>
      <comments>http://www.simonboigelot.com/post/Blog-Update.aspx#comment</comments>
      <guid isPermaLink="false">http://www.simonboigelot.com/post.aspx?id=d0775b22-8755-4f96-9fe2-d08887f7f600</guid>
      <pubDate>Mon, 16 Mar 2009 15:56:00 -0400</pubDate>
      <dc:publisher>Togis</dc:publisher>
      <pingback:server>http://www.simonboigelot.com/pingback.axd</pingback:server>
      <pingback:target>http://www.simonboigelot.com/post.aspx?id=d0775b22-8755-4f96-9fe2-d08887f7f600</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.simonboigelot.com/trackback.axd?id=d0775b22-8755-4f96-9fe2-d08887f7f600</trackback:ping>
      <wfw:comment>http://www.simonboigelot.com/post/Blog-Update.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.simonboigelot.com/syndication.axd?post=d0775b22-8755-4f96-9fe2-d08887f7f600</wfw:commentRss>
    <feedburner:origLink>http://www.simonboigelot.com/post.aspx?id=d0775b22-8755-4f96-9fe2-d08887f7f600</feedburner:origLink></item>
    <item>
      <title>Methodes Anonymes - Simplifier votre code</title>
      <description>&lt;p&gt;
 L&amp;#39;ajout d&amp;#39;une fonction au call d&amp;#39;un &amp;eacute;v&amp;egrave;nement a toujours &amp;eacute;t&amp;eacute; quelque chose de laid, de difficile &amp;agrave; lire pour quelqu&amp;#39;un de diff&amp;eacute;rent de celui qui l&amp;#39;a d&amp;eacute;finie. 
&lt;/p&gt;
 
&lt;p&gt;
 Les m&amp;eacute;thodes anonymes de c# 3.5 simplifie grandement l&amp;#39;&amp;eacute;criture de ces fonctions. 
&lt;/p&gt;
 
&lt;p&gt;
 Pour exemple :&lt;br /&gt;
 Un simple &amp;eacute;v&amp;egrave;nement &amp;quot;OnMyEvent&amp;quot; qui, une foi appell&amp;eacute;, incr&amp;eacute;mente la variable enti&amp;egrave;re &amp;quot;NombreDeCall&amp;quot;. 
&lt;/p&gt;
 
&lt;p&gt;
 Sans les m&amp;eacute;thodes anonymes, voici ce que cel&amp;agrave; donne : 
&lt;/p&gt;
 
&lt;p&gt;
 &lt;div class="code"&gt;
[code:c#] &lt;br /&gt;
 &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler OnMyEvent;&lt;br /&gt;
 &lt;span class="kwrd"&gt;int&lt;/span&gt; NombreDeCall = 0;&lt;br /&gt;
 &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FonctionQuelconque()&lt;br /&gt;
 {&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnMyEvent += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(Program_OnMyEvent);&lt;br /&gt;
 } 
&lt;/p&gt;
 
&lt;p&gt;
 &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FonctionCallEvent()&lt;br /&gt;
 {&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (OnMyEvent != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnMyEvent(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br /&gt;
 } 
&lt;/p&gt;
 
&lt;p&gt;
 &lt;span class="kwrd"&gt;void&lt;/span&gt; Program_OnMyEvent(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;
 {&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NombreDeCall++;&lt;br /&gt;
 } &lt;br /&gt;
 [/code]&lt;/div&gt; 
&lt;/p&gt;
 
&lt;p&gt;
 Avec les m&amp;eacute;thodes anonymes, nous n&amp;#39;avons plus &amp;agrave; d&amp;eacute;crire le prototype de&amp;nbsp;la fonction &amp;quot;Program_OnMyEvent&amp;quot;.&lt;br /&gt;
 En effet, cette fonction n&amp;#39;ayant pour but que d&amp;#39;&amp;ecirc;tre appell&amp;eacute; par l&amp;#39;&amp;eacute;v&amp;egrave;nement &amp;quot;OnMyEvent&amp;quot;, le programmeur n&amp;#39;a aucune utilit&amp;eacute; de la nommer. 
&lt;/p&gt;
 
&lt;p&gt;
 Le code devient ainsi : 
&lt;/p&gt;
 
&lt;p&gt;
 &lt;div class="code"&gt;
[code:c#]&lt;br /&gt;
 &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler OnMyEvent;&lt;br /&gt;
 &lt;span class="kwrd"&gt;int&lt;/span&gt; NombreDeCall = 0; 
&lt;/p&gt;
 
&lt;p&gt;
 &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FonctionQuelconque()&lt;br /&gt;
 {&lt;br /&gt;
 &lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnMyEvent += (sender, e) =&amp;gt;&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NombreDeCall++;&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/strong&gt;&lt;br /&gt;
 } 
&lt;/p&gt;
 
&lt;p&gt;
 &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; FonctionCallEvent()&lt;br /&gt;
 {&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="kwrd"&gt;if&lt;/span&gt; (OnMyEvent != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OnMyEvent(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br /&gt;
 }&lt;br /&gt;
 [/code]&lt;/div&gt; 
&lt;/p&gt;
 
&lt;p&gt;
 Cette m&amp;eacute;thode anonyme est &amp;eacute;crite de la facon suivante : 
&lt;/p&gt;
 
&lt;p&gt;
 &lt;div class="code"&gt;
[code:c#]&lt;br /&gt;
 ( liste des noms donn&amp;eacute; aux param&amp;egrave;tres dont les types sont d&amp;eacute;duit par le compilateur ) =&amp;gt;&amp;nbsp;&lt;br /&gt;
 { &lt;br /&gt;
 &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="rem"&gt;//corp de la fonction &lt;br /&gt;&lt;/span&gt;
 };&lt;br /&gt;
 [/code]&lt;/div&gt; 
&lt;/p&gt;
 
&lt;p&gt;
 &amp;nbsp; 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SimonBoigelotWorld/~4/JjLKUSKeSG8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/SimonBoigelotWorld/~3/JjLKUSKeSG8/post.aspx</link>
      <author>simon.boigelot.nospam@nospam.heode.com (Togis)</author>
      <comments>http://www.simonboigelot.com/post/Methodes-Anonymes-Simplifier-votre-code.aspx#comment</comments>
      <guid isPermaLink="false">http://www.simonboigelot.com/post.aspx?id=fab4a021-cb84-44d3-adac-4c2b1af572fe</guid>
      <pubDate>Wed, 04 Mar 2009 18:14:00 -0400</pubDate>
      <category>.NET 3.5</category>
      <category>Tips</category>
      <dc:publisher>Togis</dc:publisher>
      <pingback:server>http://www.simonboigelot.com/pingback.axd</pingback:server>
      <pingback:target>http://www.simonboigelot.com/post.aspx?id=fab4a021-cb84-44d3-adac-4c2b1af572fe</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.simonboigelot.com/trackback.axd?id=fab4a021-cb84-44d3-adac-4c2b1af572fe</trackback:ping>
      <wfw:comment>http://www.simonboigelot.com/post/Methodes-Anonymes-Simplifier-votre-code.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.simonboigelot.com/syndication.axd?post=fab4a021-cb84-44d3-adac-4c2b1af572fe</wfw:commentRss>
    <feedburner:origLink>http://www.simonboigelot.com/post.aspx?id=fab4a021-cb84-44d3-adac-4c2b1af572fe</feedburner:origLink></item>
    <item>
      <title>Livre Silverlight 2</title>
      <description>&lt;p&gt;
Ca y est! 
&lt;/p&gt;
&lt;p&gt;
Enfin ca fait d&amp;eacute;j&amp;agrave; quelques jours maintenant, mais je n&amp;#39;ai pas pris le temps d&amp;#39;en parler. 
&lt;/p&gt;
&lt;p&gt;
En coop&amp;eacute;ration avec Loic Bar, je viens de sortir mon premier livre. Ce dernier est en vente dans toutes les bonnes &amp;eacute;piceries 
&lt;img src="/editors/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif" border="0" alt="Foot in mouth" title="Foot in mouth" /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.simonboigelot.com/image.axd?picture=51FK1LVyR-L__SL500_AA240_.jpg" alt="" width="240" height="240" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Vous y retrouverez tout ce que vous devez savoir pour cr&amp;eacute;er une application Silverlight complete, de l&amp;#39;&amp;eacute;criture de l&amp;#39;interface au acc&amp;egrave;s au donn&amp;eacute;es. 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SimonBoigelotWorld/~4/omqObnvmU_w" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/SimonBoigelotWorld/~3/omqObnvmU_w/post.aspx</link>
      <author>simon.boigelot.nospam@nospam.heode.com (Togis)</author>
      <comments>http://www.simonboigelot.com/post/Livre-Silverlight-2.aspx#comment</comments>
      <guid isPermaLink="false">http://www.simonboigelot.com/post.aspx?id=d8f45c27-6ef3-411b-a135-61175751c546</guid>
      <pubDate>Wed, 04 Mar 2009 17:27:00 -0400</pubDate>
      <category>General</category>
      <category>.NET 3.5</category>
      <category>Publication</category>
      <category>Silverlight</category>
      <dc:publisher>Togis</dc:publisher>
      <pingback:server>http://www.simonboigelot.com/pingback.axd</pingback:server>
      <pingback:target>http://www.simonboigelot.com/post.aspx?id=d8f45c27-6ef3-411b-a135-61175751c546</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.simonboigelot.com/trackback.axd?id=d8f45c27-6ef3-411b-a135-61175751c546</trackback:ping>
      <wfw:comment>http://www.simonboigelot.com/post/Livre-Silverlight-2.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.simonboigelot.com/syndication.axd?post=d8f45c27-6ef3-411b-a135-61175751c546</wfw:commentRss>
    <feedburner:origLink>http://www.simonboigelot.com/post.aspx?id=d8f45c27-6ef3-411b-a135-61175751c546</feedburner:origLink></item>
    <item>
      <title>Envoyer un mail en utilisant System.Net.Mail et le SMTP de gmail</title>
      <description>&lt;p&gt;
Envoyer un mail en .Net, rien de plus simple : 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&amp;nbsp;Ajoutez &amp;agrave; votre projet une r&amp;eacute;f&amp;eacute;rence vers l&amp;#39;assembly System.Net.Mail&lt;/li&gt; 
	&lt;li&gt;Cr&amp;eacute;ez un SmtpClient :&lt;br /&gt;
	&lt;div class="code"&gt;
[code:c#]&lt;br /&gt;
    SmtpClient smtp = &lt;span class="kwrd"&gt;new&lt;/span&gt; SmtpClient(&amp;quot;smtp.gmail.com&amp;quot;);&lt;br /&gt;
    smtp.UseDefaultCredentials = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;
    smtp.EnableSsl = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;
    smtp.Port = 587;&lt;br /&gt;
    [/code]&lt;/div&gt;&lt;/li&gt; 
	&lt;li&gt;Configurez votre login si neccesaire. Voici un exemple de login sur le smtp de gmail :&lt;br /&gt;
	&lt;div class="code"&gt;
[code:c#]&lt;br /&gt;
    NetworkCredential cred = &lt;span class="kwrd"&gt;new&lt;/span&gt; NetworkCredential(&amp;quot;Simon.Boigelot@heode.com&amp;quot;, &amp;quot;*******&amp;quot;);&lt;br /&gt;
    smtp.Credentials = cred;&lt;br /&gt;
    [/code]&lt;/div&gt;&lt;/li&gt; 
	&lt;li&gt;Cr&amp;eacute;ez et envoyez votre mail :&lt;br /&gt;
	&lt;div class="code"&gt;
[code:c#]&lt;br /&gt;
    MailMessage email = &lt;span class="kwrd"&gt;new&lt;/span&gt; MailMessage(&lt;br /&gt;
    &lt;a href=&lt;span class="str"&gt;"mailto:CoffeeCup@heode.com"&lt;/span&gt;&gt;&amp;quot;From&amp;quot;&lt;/a&gt;,&lt;br /&gt;
    &lt;a href=&lt;span class="str"&gt;"mailto:Simon.Boigelot@wipus.com"&lt;/span&gt;&gt;&amp;quot;To&amp;quot;&lt;/a&gt;,&lt;br /&gt;
    &amp;quot;Title&amp;quot;,&lt;br /&gt;
    &amp;quot;Body&amp;quot;);&lt;br /&gt;
    email.Priority = MailPriority.High;&lt;br /&gt;
    email.IsBodyHtml = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;
    &lt;br /&gt;
    &lt;p&gt;
    &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;
    { &lt;br /&gt;
    &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; smtp.Send(email);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)&lt;br /&gt;
    {&lt;br /&gt;
    &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(&amp;quot;Exception caught : {0}&amp;quot;,ex.ToString());&lt;br /&gt;
    }&lt;br /&gt;
    [/code]&lt;/div&gt; 
	&lt;/p&gt;
	&lt;/li&gt; 
&lt;/ul&gt;
&lt;p&gt;
Pour envoyer un email &amp;agrave; plusieurs destinataires simultan&amp;eacute;ment le principe reste le m&amp;ecirc;me : 
&lt;img src="/editors/tiny_mce/plugins/emotions/images/smiley-wink.gif" border="0" alt="Wink" title="Wink" /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;div class="code"&gt;
[code:c#]&lt;br /&gt;
MailMessage email = &lt;span class="kwrd"&gt;new&lt;/span&gt; MailMessage();&lt;br /&gt;
email.From = &lt;span class="kwrd"&gt;new&lt;/span&gt; MailAddress(&amp;quot;CoffeeCup@heode.com&amp;quot;,&amp;quot;CoffeeCup&amp;quot;);&lt;br /&gt;
email.To.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; MailAddress(&amp;quot;&lt;a href=&lt;span class="str"&gt;"mailto:Simon.Boigelot@heode.com"&lt;/span&gt;&gt;Simon.Boigelot@heode.com&lt;/a&gt;&amp;quot;));&lt;br /&gt;
email.To.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; MailAddress(&amp;quot;&lt;a href=&lt;span class="str"&gt;"mailto:SBoigelot@gmail.com"&lt;/span&gt;&gt;SBoigelot@gmail.com&lt;/a&gt;&amp;quot;));&lt;br /&gt;
email.Subject = &amp;quot;Multi &amp;#39;To&amp;#39; mail&amp;quot;;&lt;br /&gt;
email.Body = &amp;quot;Have you seen my Body ;)&amp;quot;;&lt;br /&gt;
email.Priority = MailPriority.High;&lt;br /&gt;
email.IsBodyHtml = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;
[/code]&lt;/div&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp; 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SimonBoigelotWorld/~4/r9ti-yY37SU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/SimonBoigelotWorld/~3/r9ti-yY37SU/post.aspx</link>
      <author>simon.boigelot.nospam@nospam.heode.com (Togis)</author>
      <comments>http://www.simonboigelot.com/post/Envoyer-un-mail-en-utilisant-SystemNetMail-et-le-SMTP-de-gmail.aspx#comment</comments>
      <guid isPermaLink="false">http://www.simonboigelot.com/post.aspx?id=212fe5ff-9463-4caa-b0fd-ba0e3b236648</guid>
      <pubDate>Mon, 02 Mar 2009 16:33:00 -0400</pubDate>
      <category>.NET 3.5</category>
      <category>Tips</category>
      <dc:publisher>Togis</dc:publisher>
      <pingback:server>http://www.simonboigelot.com/pingback.axd</pingback:server>
      <pingback:target>http://www.simonboigelot.com/post.aspx?id=212fe5ff-9463-4caa-b0fd-ba0e3b236648</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.simonboigelot.com/trackback.axd?id=212fe5ff-9463-4caa-b0fd-ba0e3b236648</trackback:ping>
      <wfw:comment>http://www.simonboigelot.com/post/Envoyer-un-mail-en-utilisant-SystemNetMail-et-le-SMTP-de-gmail.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.simonboigelot.com/syndication.axd?post=212fe5ff-9463-4caa-b0fd-ba0e3b236648</wfw:commentRss>
    <feedburner:origLink>http://www.simonboigelot.com/post.aspx?id=212fe5ff-9463-4caa-b0fd-ba0e3b236648</feedburner:origLink></item>
    <item>
      <title>Architecture simplifi&amp;eacute;e de BizTalk</title>
      <description>&lt;p&gt;Dans cet article vous trouverez une première compréhension générale de l'architecture de BizTalk. &lt;p&gt;Cette compréhension est nécessaire avant de nous plonger dans le développement. &lt;p&gt;BizTalk permet de mettre en place des flux de données à partir d’une origine A vers un destination B. Mais que ce passe-t-il entre ces deux points ? Tel est la question à laquelle nous allons répondre. &lt;p&gt;Voici une vue très simplifiée de l’architecture de BizTalk : &lt;p&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/ArchitecturesimplifiedeBizTalk_41DA/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="196" alt="image" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/ArchitecturesimplifiedeBizTalk_41DA/image_thumb.png" width="447" border="0"&gt;&lt;/a&gt;  &lt;blockquote&gt; &lt;p&gt;1. Les données sont reçues par un &lt;b&gt;Receive Port&lt;/b&gt;. Les receive ports ne font que transmettre les données en format binaire, sans se soucier du contenu de ce qu’ils transportent. &lt;p&gt;2. Elles sont acheminées vers une base de données centrale par une &lt;b&gt;Receive Pipeline.&lt;/b&gt; C’est lors de cette phase du transport que le mapping sera appliqué aux données binaires pour fournir un format XML comprenant des &lt;b&gt;promoted properties&lt;/b&gt;. &lt;p&gt;3. Ensuite, si des orchestrations sont configurées pour agir sur le type de message reçu, elles seront instanciées. Une orchestration est une étape du processus métier qui est prise en charge par BizTalk. &lt;p&gt;4. Les &lt;b&gt;Send Pipelines&lt;/b&gt; sont l’exact opposé des Receive Pipelines. Ces pipelines vont prendre les données sous format XML et les convertir dans le format destination désiré. Encore une foi grâce à un mapping. &lt;p&gt;5. Les données sont enfin envoyées au destinataire par un &lt;b&gt;Send Port&lt;/b&gt; qui ne se charge que de transmettre les informations binaires au bon endroit.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Pour savoir quelle est l’étape à appliquer à un message à un moment donné, BizTalk garde un fichier supplémentaire, le fichier de contexte. &lt;p&gt;Ce fichier de contexte possède de nombreuses information tel que : &lt;blockquote&gt; &lt;p&gt;· Le type du fichier message&lt;br&gt;· L’historique complet du fichier à travers le processus BizTalk&lt;br&gt;· Les erreurs éventuelles survenues&lt;br&gt;· Les différentes promoted properties&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;C’est sur les valeurs contenues dans ce fichier de contexte que les différentes parties du flux BizTalk, les &lt;b&gt;artefacts&lt;/b&gt;, peuvent souscrire. &lt;p&gt;Ainsi nous allons pouvoir créer, par exemple, une Send Pipeline et la souscrire aux messages ayant un schéma correspondant au XSD « monSchema.xsd » et provenant de l’orchestration « monOrchestration ». &lt;p&gt;Le moteur interne de BizTalk créera alors toutes les suscriptions T-SQL nécessaire pour instancier cette Send Pipeline à chaque foi que des données correspondante seront insérée dans la MessageBox. &lt;p&gt;La &lt;b&gt;MessageBox&lt;/b&gt; est le cœur de BizTalk. Elle repose sous SQL-Server ce qui nous offre beaucoup de possibilité quand à la fragmentation de cette base de donnée. &lt;p&gt;Lorsque qu’un fichier est reçu par BizTalk on parle de message. Les messages peuvent-être dupliqué, ainsi si plusieurs artefacts ont une suscription qui correspond à un même message, chacun de ces artefacts recevra une copie autonome du message. &lt;p&gt;Maintenant que nous avons une vue globale de l’architecture de BizTalk, nous allons pouvoir nous intéresser en détail à chaque artéfact. &lt;h2&gt;Port&lt;/h2&gt; &lt;p&gt;Un port est la représentation logique d’une communication physique par laquelle BizTalk reçoit et envoi des messages. &lt;p&gt;Chaque port est un conteneur qui possède toutes les informations nécessaires à l’établissement d’un canal de communication. &lt;p&gt;L’élément principal d’un port est l’adaptateurs qu’il utilise. Chaque type de communication possède son adaptateur. &lt;p&gt;Par exemple, un Send Port utilisant le protocole FTP possèdera un adaptateur FTP ainsi que les configurations suivantes : &lt;blockquote&gt; &lt;p&gt;· Ip de contact&lt;br&gt;· Login&lt;br&gt;· Password&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Pour ne citer que les plus évidentes. &lt;h3&gt;Receive Port&lt;/h3&gt; &lt;p&gt;Les receive ports ont pour particularité d’être des conteneurs de Port. Ainsi un unique reveive port peut en faite être associé à plusieurs configurations différentes, nommée Receive Location. &lt;p&gt;Ainsi un receive port attendant des ordres d’achat pourra être composé de plusieurs receive locations : &lt;blockquote&gt; &lt;p&gt;· La première attendant des fichiers sur un FTP&lt;br&gt;· La seconde sur le système de fichier d’un serveur&lt;br&gt;· La troisième par mail&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Quelque soit l’origine du fichier reçu, il sera traité de la même manière dans la suite du flux de donnée. &lt;h3&gt;Send Port&lt;/h3&gt; &lt;h5&gt;En contradiction avec les receive port, les send ports eux ne peuvent contenir qu’un unique port de destination.&lt;/h5&gt; &lt;p&gt;Pour palier à ce désavantage, BizTalk offre la possibilité de crée des SendPortGroup, contenant plusieurs Send Port. &lt;h3&gt;Logical Port&lt;/h3&gt; &lt;p&gt;Lors de la création d’une orchestration, le programmeur ne sait pas forcément d’où lui viendra les données, ni où il devra les envoyer ensuite. &lt;p&gt;C’est dans ces cas précis qu’interviennent les ports logiques. &lt;p&gt;Les ports logiques ne doivent être liés à des ports physiques qu’au moment du déploiement de l’application. &lt;h3&gt;Dynamic Send Port&lt;/h3&gt; &lt;p&gt;Ces send ports particulier permettent de définir la destination des messages au moment de l’exécution au lieu de le faire lors déploiement de l’application. &lt;p&gt;Cette destination doit être définie par déduction sur des promoted properties. &lt;h2&gt;Adaptateur&lt;/h2&gt; &lt;p&gt;Les adaptateurs sont les interfaces de communication de BizTalk autant en entrée qu’en sortie. &lt;p&gt;La plupart du temps, les adaptateurs ne sont que des interfaces de communication basée sur un protocole de transport donné. Ils n’ont donc aucune compréhension interne des données qu’ils transportent. &lt;p&gt;Leur unique utilité est de nourrir et de délester la machinerie de BizTalk. &lt;p&gt;Dans le cas d’adaptateur de réception, deux modes principaux existent : &lt;blockquote&gt; &lt;p&gt;· Le pooling : de temps à autre l’adaptateur vérifie le contenu d’un répertoire (ou autre) pour vérifier si des messages attendu par BizTalk ne s’y trouve pas. C’est le cas du « &lt;b&gt;File System Adaptater&lt;/b&gt; ».&lt;br&gt;· L’écoute : l’adaptateur est en attente d’un événement en provenance su monde extérieur pour se réveiller.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Lorsqu’un message est reçu par un adaptateur, contrairement à ce que l’on dessine habituellement, il n’est pas envoyé directement à une receive pipeline mais passe d’abord par la MessageBox. &lt;p&gt;C’est le « &lt;b&gt;Message Engine&lt;/b&gt; » de BizTalk qui à la charge de transmettre ce message de la MessageBox a la receive pipeline appropriée. &lt;p&gt;Un adaptateur des plus important est le « &lt;b&gt;SQL Adaptater&lt;/b&gt; », en effet, la MessageBox reposant sur une base de données SQL Server, chaque communication interne à BizTalk repose sur cet adaptateur. &lt;h2&gt;Pipeline&lt;/h2&gt; &lt;p&gt;Les pipelines ont pour fonction d’effectuer des traitements de données sur les messages entrants ou les messages sortants. Cet aussi cet artéfact qui à comme responsabilité la validation de ces messages. &lt;p&gt;Par traitements de données ont entent principalement tout ce qui est sécurité (cryptage/décryptage, signature). &lt;p&gt;BizTalk fournit 4 pipelines basiques qui permettent de remplir toutes les fonctions les plus couramment utilisées : &lt;p&gt;· Receive Pipeline &lt;blockquote&gt; &lt;p&gt;o XmlReceive : permet de recevoir des messages XML et de les valider&lt;br&gt;o PassThruReceive : permet de recevoir des messages sous format flat file&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;· SendPipeline &lt;blockquote&gt; &lt;p&gt;o XmdTransmit : permet d’envoyer des messages XML et de les valider&lt;br&gt;o PassThruTransmit : permet d’envoyer des messages sous format flat file&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Comme son nom l’indique, un pipeline est un suivit d’opérations les unes aux suites des autres. Dans un pipeline l’ordre des opérations est très important, en effet, a quoi bon par exemple essayer de valider un fichier XML qui n’a pas été décrypté. &lt;p&gt;Pour simplifier la mise en place de pipeline, BizTalk à séparé en grands groupes les type d’opérations pouvant être effectuée sur un message. &lt;p&gt;&lt;strong&gt;Receive Pipeline Operation Group :&lt;/strong&gt; &lt;blockquote&gt; &lt;p&gt;1. Décode : cette étape sert à décoder les messages d’un format externe à un format lisible par les autres composants. Le plus commun des cas de décode est sans nul doute le décryptage.&lt;br&gt;2. Désassemble : en fonction du type de message, cette étape va soit traduire le message d’origine en un message XML, soit découper le message en plusieurs sous-messages plus conforme à l’implémentation du flux.&lt;br&gt;3. Validation : valide un message à partir d’un schéma.&lt;br&gt;4. Résoudre les partenaires : cette étape est principalement utilisée pour certifier la provenance des messages reçus.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;Send Pipeline Operation Group :&lt;/strong&gt; &lt;blockquote&gt; &lt;p&gt;1. Pré-assemble : cette étape et le dernier point de modifications des données par le flux BizTalk, généralement utilisée pour faire des transformations de dernière minute sur le XML interne de BizTalk avant qu’il ne soit transformé en flat file.&lt;br&gt;2. Assemble : utilisation d’un schéma pour transformer un ou plusieurs messages en un message respectant le format convenant au destinataire.&lt;br&gt;3. Encore : à l’inverse de décode, cette phase est utilisée pour crypter les données. (Un autre exemple est la compression des données)&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;De nombreux composant de pipelines effectuant ce genre d’opération sont inclus dans BizTalk mais il est toujours possible d’écrire nos propres composants ou d’en acheter de nouveau, comme d’habitude. &lt;h2&gt;Orchestration&lt;/h2&gt; &lt;p&gt;Les orchestrations permettent au développeur BizTalk d’implémenter un processus métier à travers un outil de dessin : l’Orchestration Designer. &lt;p&gt;Cet outil permet d’exprimer le processus métier via une série de forme glissée sur la surface de dessin à partir de la boîte à outil de Visual Studio. &lt;p&gt;A travers ces dessins, tout le framework .Net ainsi que le framework BizTalk sont accessible. &lt;p&gt;Il est ainsi possible de laisser libre cours à son implémentation du processus métier sans pour autant devoir écrire plusieurs programmes fastidieux pour gérer chaque étape de ce processus. &lt;p&gt;Les orchestrations, tout comme les autres artéfacts de BizTalk, souscrivent à certain messages arrivant dans la MessageBox et sont instanciée par celle-ci lorsque l’un deux arrive. &lt;p&gt;Ces orchestrations sont alors capable, par exemple de gérer des exception tel que : « A la réception d’un ordre d’achat j’envoie une facture, mais si je n’ai pas d’accusé de réception avant 2 jours, j’annule l’ordre » &lt;p&gt;Encore une foi, les « &lt;b&gt;shape d’orchestration&lt;/b&gt; », ces fameuses formes servant à dessiner sont nombreuses mais il est toujours possible de créer les nôtre.&lt;img src="http://feeds.feedburner.com/~r/SimonBoigelotWorld/~4/EB3-A_cyKXs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/SimonBoigelotWorld/~3/EB3-A_cyKXs/post.aspx</link>
      <author>simon.boigelot.nospam@nospam.heode.com (Togis)</author>
      <comments>http://www.simonboigelot.com/post/Architecture-simplifieacute3be-de-BizTalk.aspx#comment</comments>
      <guid isPermaLink="false">http://www.simonboigelot.com/post.aspx?id=3fd9a5d2-2860-44cb-8e16-3dc4568495d2</guid>
      <pubDate>Mon, 14 Jul 2008 22:41:35 -0400</pubDate>
      <category>BizTalk</category>
      <dc:publisher>Togis</dc:publisher>
      <pingback:server>http://www.simonboigelot.com/pingback.axd</pingback:server>
      <pingback:target>http://www.simonboigelot.com/post.aspx?id=3fd9a5d2-2860-44cb-8e16-3dc4568495d2</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.simonboigelot.com/trackback.axd?id=3fd9a5d2-2860-44cb-8e16-3dc4568495d2</trackback:ping>
      <wfw:comment>http://www.simonboigelot.com/post/Architecture-simplifieacute3be-de-BizTalk.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.simonboigelot.com/syndication.axd?post=3fd9a5d2-2860-44cb-8e16-3dc4568495d2</wfw:commentRss>
    <feedburner:origLink>http://www.simonboigelot.com/post.aspx?id=3fd9a5d2-2860-44cb-8e16-3dc4568495d2</feedburner:origLink></item>
    <item>
      <title>Cr&amp;eacute;er une orchestration BizTalk avec Visual Studio</title>
      <description>&lt;p&gt;
Dans cet exercice nous allons apprendre &amp;agrave; cr&amp;eacute;er des orchestrations gr&amp;acirc;ce &amp;agrave; l&amp;rsquo;Orchestration Designer de BizTalk. 
&lt;/p&gt;
&lt;p&gt;
L&amp;rsquo;orchestration que nous allons cr&amp;eacute;er va faire exactement la m&amp;ecirc;me chose que les filtres des Send Ports du chapitre pr&amp;eacute;c&amp;eacute;dent. Cependant gardez &amp;agrave; l&amp;rsquo;esprit que les orchestrations ont bien plus de capacit&amp;eacute;s, mais il faut bien commencer petit. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Ouvrez Visual Studio 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Cr&amp;eacute;er un nouveau projet &amp;laquo; &lt;strong&gt;Empty Biztalk Server Project&lt;/strong&gt; &amp;raquo; du nom de &amp;laquo; &lt;strong&gt;LabOrchestration&lt;/strong&gt; &amp;raquo; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; N&amp;rsquo;oubliez pas de directement changer le nom de d&amp;eacute;ploiement du projet pour &amp;laquo; &lt;strong&gt;LabOrchestration&lt;/strong&gt; &amp;raquo; et de lui assigner une clef de signature. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Ajoutez 1 sch&amp;eacute;ma au projet :&lt;br /&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_26.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_12.png" border="0" alt="image" width="244" height="89" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Pour des raisons &amp;eacute;ducative, ne faites pas de &amp;laquo; &lt;strong&gt;NombrePage&lt;/strong&gt; &amp;raquo; un &amp;laquo; &lt;strong&gt;xs :int&lt;/strong&gt; &amp;raquo; mais gardez le en &amp;laquo; &lt;strong&gt;xs :string&lt;/strong&gt; &amp;raquo; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Pour pouvoir utiliser ce champ lors d&amp;rsquo;une orchestration, il doit recevoir une promotion particuli&amp;egrave;re nomm&amp;eacute;e &amp;laquo; &lt;strong&gt;Distinguished Field&lt;/strong&gt; &amp;raquo;. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Pour ce faire, cliquez sur le champ avec le bouton droit de la souris et s&amp;eacute;lectionnez &amp;laquo; &lt;strong&gt;Promote &lt;/strong&gt;&lt;strong&gt;&amp;agrave; Show Promotion&lt;/strong&gt; &amp;raquo; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_2.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb.png" border="0" alt="image" width="244" height="67" /&gt;&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Dans la bo&amp;icirc;te de dialogue qui s&amp;rsquo;ouvre vous trouvez la possibilit&amp;eacute; d&amp;rsquo;ajouter le champ &amp;laquo; &lt;strong&gt;NombrePage&lt;/strong&gt; &amp;raquo; aux &amp;laquo; &lt;strong&gt;Distinguished Fields&lt;/strong&gt; &amp;raquo;. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Cliquez avec le bouton droit de la souris sur votre projet, s&amp;eacute;lectionnez &amp;laquo; &lt;strong&gt;Add &lt;/strong&gt;&lt;strong&gt;&amp;agrave;&lt;/strong&gt;&lt;strong&gt; New Item&amp;hellip;&lt;/strong&gt; &amp;raquo; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Dans la bo&amp;icirc;te de dialogue &amp;laquo; &lt;strong&gt;Add New Item&lt;/strong&gt; &amp;raquo;, sous &amp;laquo; &lt;strong&gt;Orchestration Files&lt;/strong&gt; &amp;raquo; choisissez &amp;laquo; &lt;strong&gt;BizTalk Orchestration&lt;/strong&gt; &amp;raquo; et nommez la &amp;laquo; &lt;strong&gt;OrchestrationTrieLivre &lt;/strong&gt;&amp;raquo; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; L&amp;rsquo;&amp;eacute;diteur d&amp;rsquo;orchestration s&amp;rsquo;ouvre dans Visual Studio. 
&lt;/p&gt;
&lt;p&gt;
Une orchestration commence toujours par la r&amp;eacute;ception d&amp;rsquo;un message, soit par suscription, soit par appel &amp;agrave; partir d&amp;rsquo;une autre orchestration. 
&lt;/p&gt;
&lt;p&gt;
Dans la bo&amp;icirc;te &amp;agrave; outil de Visual Studio vous trouverez tous les &amp;laquo; &lt;strong&gt;Shapes&lt;/strong&gt; &amp;raquo; de base utilis&amp;eacute;s lors de la cr&amp;eacute;ation d&amp;rsquo;une nouvelle orchestration. 
&lt;/p&gt;
&lt;p&gt;
Passons en revue les plus int&amp;eacute;ressants :
&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="2" width="400"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;strong&gt;Shape&lt;/strong&gt;&lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			&lt;strong&gt;Explication&lt;/strong&gt;
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_28.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_13.png" border="0" alt="image" width="209" height="22" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Action d&amp;rsquo;envoyer un message &amp;agrave; travers un Send Port
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_30.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_14.png" border="0" alt="image" width="214" height="30" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Action de recevoir un message en provenance d&amp;rsquo;un Receive Port.
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_32.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_15.png" border="0" alt="image" width="216" height="37" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Repr&amp;eacute;sentation d&amp;rsquo;un port au niveau d&amp;rsquo;une orchestration, il s&amp;rsquo;agit ici d&amp;rsquo;un port logique qui devra &amp;ecirc;tre li&amp;eacute; &amp;agrave; un port physique lors de la configuration de l&amp;rsquo;orchestration. (Apr&amp;egrave;s d&amp;eacute;ploiement)
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_34.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_16.png" border="0" alt="image" width="210" height="27" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Permet d&amp;rsquo;appliquer un map XSLT sur un message
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_36.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_17.png" border="0" alt="image" width="215" height="28" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Action de construire un nouveau message sur base d&amp;rsquo;un sch&amp;eacute;ma
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_38.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_18.png" border="0" alt="image" width="214" height="52" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Permet &amp;agrave; une orchestration d&amp;rsquo;en invoquer d&amp;rsquo;autre. Call est synchrone, Start asynchrone.
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_40.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_19.png" border="0" alt="image" width="214" height="27" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Permet de faire appel au Business Rule Engine.
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_42.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_20.png" border="0" alt="image" width="211" height="30" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Permet l&amp;rsquo;appel d&amp;rsquo;un script .Net
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_44.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_21.png" border="0" alt="image" width="214" height="36" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Repr&amp;eacute;sentation d&amp;rsquo;un &amp;laquo; If-then-else &amp;raquo;
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_46.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_22.png" border="0" alt="image" width="212" height="29" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Permet &amp;agrave; l&amp;rsquo;orchestration de marquer un temps de pause
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_48.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_23.png" border="0" alt="image" width="212" height="28" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Multithreading interne aux orchestrations
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_50.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_24.png" border="0" alt="image" width="211" height="31" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Repr&amp;eacute;sentation d&amp;rsquo;un boucle &amp;laquo; Tant que (condition) &amp;raquo;
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_52.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_25.png" border="0" alt="image" width="213" height="51" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Shapes utilis&amp;eacute;e pour la gestion des erreurs
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_54.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_26.png" border="0" alt="image" width="212" height="34" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Met une Orchestration en attentent de l&amp;rsquo;action d&amp;rsquo;un administrateur.
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td width="200" valign="top"&gt;&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_56.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_27.png" border="0" alt="image" width="213" height="32" /&gt;&lt;/a&gt; &lt;/td&gt;
			&lt;td width="200" valign="top"&gt;
			&lt;p&gt;
			Met fin &amp;agrave; l&amp;rsquo;orchestration
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
Notre orchestration doit recevoir un Livre et l&amp;rsquo;envoyer &amp;agrave; deux ports diff&amp;eacute;rents selon le nombre de Page qu&amp;rsquo;il contient. 
&lt;/p&gt;
&lt;p&gt;
Pour ce faire, il nous faudra donc : 
&lt;/p&gt;
&lt;p&gt;
&amp;Oslash; 3 Ports Logique (1 receive, 2 send) 
&lt;/p&gt;
&lt;p&gt;
&amp;Oslash; 1 Receive Shape 
&lt;/p&gt;
&lt;p&gt;
&amp;Oslash; 2 Send Shapes 
&lt;/p&gt;
&lt;p&gt;
&amp;Oslash; 1 Decide Shape 
&lt;/p&gt;
&lt;p&gt;
Ajoutez le premier Port Logique &amp;agrave; l&amp;rsquo;orchestration en le glissant sur le &amp;laquo; &lt;strong&gt;Port Surface &lt;/strong&gt;&amp;raquo; de gauche du designer. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_4.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_1.png" border="0" alt="image" width="244" height="86" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Un assistant de configuration de ce port s&amp;rsquo;ouvre. Cliquez sur &lt;strong&gt;Next&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Le nom de ce port est &amp;laquo; &lt;strong&gt;OrchRcvPortLivre&lt;/strong&gt; &amp;raquo;. Cliquez sur &lt;strong&gt;Next&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; L&amp;rsquo;assistant nous demande de choisir ou de cr&amp;eacute;e un &amp;laquo; &lt;strong&gt;Type de port&lt;/strong&gt; &amp;raquo; pour notre nouveau port logique. En effet, on ne peut lier un port physique &amp;agrave; un port logique que si, et seulement si, ses caract&amp;eacute;ristiques son similaire. Le &amp;laquo; &lt;strong&gt;Type de port&lt;/strong&gt; &amp;raquo; est le conteneur des caract&amp;eacute;ristiques de notre port logique. N&amp;rsquo;en ayant encore jamais cr&amp;eacute;&amp;eacute; auparavant dans ce projet, cr&amp;eacute;ons en un. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Choisissez &amp;laquo; &lt;strong&gt;OrchRcvPortLivreType&lt;/strong&gt; &amp;raquo; comme nom de Type 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; &amp;laquo; &lt;strong&gt;One-Way&lt;/strong&gt; &amp;raquo; et &amp;laquo; &lt;strong&gt;Internal &lt;/strong&gt;&amp;raquo; comme caract&amp;eacute;ristiques. Cliquez sur &lt;strong&gt;Next&lt;/strong&gt;. 
&lt;/p&gt;
&lt;p&gt;
Dans la page suivante de cet assistant, on nous propose de sp&amp;eacute;cifier le sens du port et on nous offre le choix entre plusieurs possibilit&amp;eacute;s quant-&amp;agrave; son impl&amp;eacute;mentation physique. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_6.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_2.png" border="0" alt="image" width="244" height="83" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&amp;laquo; &lt;strong&gt;Port binding&lt;/strong&gt; &amp;raquo; offre 3 possibilit&amp;eacute;s :&lt;br /&gt;
&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;Oslash; &lt;strong&gt;Sp&amp;eacute;cify now&lt;/strong&gt;: cr&amp;eacute;e directement un port physique sur base des informations du port logique 
&lt;/p&gt;
&lt;p&gt;
&amp;Oslash; &lt;strong&gt;Sp&amp;eacute;cify later&lt;/strong&gt; : permet au d&amp;eacute;veloppeur de lier ce port logique &amp;agrave; un port physique plus tard, apr&amp;egrave;s le d&amp;eacute;ploiement. 
&lt;/p&gt;
&lt;p&gt;
&amp;Oslash; &lt;strong&gt;Direct&lt;/strong&gt; : Ce port logique prend sa source soit directement sur la MessageBox de BizTalk, soit d&amp;rsquo;une autre Orchestration, soit de cette orchestration elle-m&amp;ecirc;me. (Cette derni&amp;egrave;re option peut para&amp;icirc;tre &amp;eacute;trange mais il ne s&amp;rsquo;agit en faite que de la possibilit&amp;eacute; de cr&amp;eacute;er des Orchestration r&amp;eacute;cursives) 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Choisissez &amp;laquo; &lt;strong&gt;Sp&amp;eacute;cify later&lt;/strong&gt; &amp;raquo;. Cliquez sur &lt;strong&gt;Next.&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
Cliquez sur le port nouvellement ajout&amp;eacute; et ouvrez ses propri&amp;eacute;t&amp;eacute;s. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_8.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_3.png" border="0" alt="image" width="244" height="129" /&gt;&lt;/a&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Remarquez que BizTalk demande que vous lui sp&amp;eacute;cifier quel sch&amp;eacute;ma sera utilis&amp;eacute; pour la validation des message entrant par ce port. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Choisissez &amp;laquo;&lt;strong&gt; LabOrchestration.Live&lt;/strong&gt; &amp;raquo; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_10.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_4.png" border="0" alt="image" width="244" height="86" /&gt;&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Ajouter un &amp;laquo; &lt;strong&gt;Receive Shape&lt;/strong&gt; &amp;raquo; &amp;agrave; l&amp;rsquo;Orchestration en le glissant sur la surface de dessin. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_12.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_5.png" border="0" alt="image" width="244" height="73" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Liez ce &amp;laquo; &lt;strong&gt;Receive&lt;/strong&gt; &lt;strong&gt;Shape&lt;/strong&gt; &amp;raquo; &amp;agrave; votre port &amp;laquo; &lt;strong&gt;OrchRcvPortLivre&lt;/strong&gt; &amp;raquo; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_14.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_6.png" border="0" alt="image" width="244" height="109" /&gt;&lt;/a&gt;&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Ajoutez un &amp;laquo; &lt;strong&gt;Decide Shape&lt;/strong&gt; &amp;raquo; &amp;agrave; l&amp;rsquo;orchestration : 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_18.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_8.png" border="0" alt="image" width="244" height="194" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; S&amp;eacute;lectionnez le point d&amp;rsquo;exclamation et cliquez sur &lt;strong&gt;&amp;laquo; No Expression, Click&amp;hellip;&lt;/strong&gt; &amp;raquo; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_16.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_7.png" border="0" alt="image" width="244" height="45" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Une bo&amp;icirc;te de script .Net s&amp;rsquo;ouvre, c&amp;rsquo;est ici que nous allons d&amp;eacute;finir la condition de notre &amp;laquo; if-then-else &amp;raquo;. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Remplissez-la par : &lt;br /&gt;
&amp;laquo; System.Int32.Parse(Message_1.NombrePage) &amp;lt; 500 &amp;raquo;&lt;br /&gt;
il s&amp;rsquo;agit de notre condition. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot;Ajoutez un Port logique dans le &amp;laquo; &lt;strong&gt;Port Surface &lt;/strong&gt;&amp;raquo; de gauche. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_20.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_9.png" border="0" alt="image" width="244" height="80" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Ajoutez un Port logique dans le &amp;laquo; &lt;strong&gt;Port Surface &lt;/strong&gt;&amp;raquo; de droite. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_22.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_10.png" border="0" alt="image" width="244" height="84" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Ajouter un &amp;laquo; &lt;strong&gt;Send Shape&lt;/strong&gt; &amp;raquo; sur chaque branche de &amp;laquo; &lt;strong&gt;Decide Shape&lt;/strong&gt; &amp;raquo; et liez les aux Send Port que vous venez de cr&amp;eacute;er. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Au final votre orchestration devrait ressembler &amp;agrave; ceci : 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_24.png"&gt;&lt;img style="border: 0px" src="http://www.simonboigelot.com/image.axd?picture=WindowsLiveWriter/CreruneorchestrationBizTalkavecVisualStu_3AFD/image_thumb_11.png" border="0" alt="image" width="244" height="159" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Avant de pouvoir enfin d&amp;eacute;ployer, il faut sp&amp;eacute;cifier &amp;agrave; cette orchestration qu&amp;rsquo;elle peut-&amp;ecirc;tre automatiquement instanci&amp;eacute;e &amp;agrave; la r&amp;eacute;ception d&amp;rsquo;un Livre. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Ouvrez les propri&amp;eacute;t&amp;eacute;s du &amp;laquo; &lt;strong&gt;Receive Shape&lt;/strong&gt; &amp;raquo; et faites-y passer la propri&amp;eacute;t&amp;eacute; &amp;laquo; &lt;strong&gt;Activate&lt;/strong&gt; &amp;raquo; &amp;agrave; true. 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; &lt;strong&gt;Deployer&lt;/strong&gt; votre projet 
&lt;/p&gt;
&lt;p&gt;
&amp;middot; Lier les ports logiques de cette orchestration avec des ports physique se fait dans &lt;strong&gt;BizTalk Server Administration&lt;/strong&gt;.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/SimonBoigelotWorld/~4/kV6bpZBPq-k" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/SimonBoigelotWorld/~3/kV6bpZBPq-k/post.aspx</link>
      <author>simon.boigelot.nospam@nospam.heode.com (Togis)</author>
      <comments>http://www.simonboigelot.com/post/Creacute3ber-une-orchestration-BizTalk-avec-Visual-Studio.aspx#comment</comments>
      <guid isPermaLink="false">http://www.simonboigelot.com/post.aspx?id=427f63ad-63d6-43f5-bea1-0027ca6fcfdb</guid>
      <pubDate>Mon, 14 Jul 2008 22:12:00 -0400</pubDate>
      <category>BizTalk</category>
      <dc:publisher>Togis</dc:publisher>
      <pingback:server>http://www.simonboigelot.com/pingback.axd</pingback:server>
      <pingback:target>http://www.simonboigelot.com/post.aspx?id=427f63ad-63d6-43f5-bea1-0027ca6fcfdb</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.simonboigelot.com/trackback.axd?id=427f63ad-63d6-43f5-bea1-0027ca6fcfdb</trackback:ping>
      <wfw:comment>http://www.simonboigelot.com/post/Creacute3ber-une-orchestration-BizTalk-avec-Visual-Studio.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.simonboigelot.com/syndication.axd?post=427f63ad-63d6-43f5-bea1-0027ca6fcfdb</wfw:commentRss>
    <feedburner:origLink>http://www.simonboigelot.com/post.aspx?id=427f63ad-63d6-43f5-bea1-0027ca6fcfdb</feedburner:origLink></item>
  <media:rating>nonadult</media:rating></channel>
</rss>
