<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Giuseppe Guerrasio : RIA</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx</link><description>Tags: RIA</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Behaviors: rendere l’interattività semplice in Blend</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2009/06/26/behaviors-rendere-l-interattivit-semplice-in-blend.aspx</link><pubDate>Fri, 26 Jun 2009 08:47:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9804841</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/9804841.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=9804841</wfw:commentRss><description>&lt;P&gt;Tra gli elementi che restano più ostici in Blend 2 per il lavoro che un interaction designer può realizzare nell’implementazione degli elementi di una interfaccia grafica in Silverlight 2, c’è sicuramente il collegamento degli eventi di interazione sull’interfaccia con azioni da innescare nel codice o sugli oggetti presenti nell’interfaccia stessa. Questa operazione, infatti, ad oggi richiede , se pur in modo semplice, lo sviluppo di alcune righe di codice con cui non sempre ha familiarità chi si occupa di interaction design .&lt;/P&gt;
&lt;P&gt;Ad esempio immaginiamo di aver realizzato un’animazione e di volerla far eseguire alla pressione di un tasto sull’interfaccia, oppure di voler eseguire il play sul MediaElement inserito nella nostra interfaccia Silverlight in conseguenza di un click su un elemento del Visual Tree. Al momento tutte queste azioni in Blend 2 con Silverlight 2 comportano l’inserimento di un handler su uno specifico evento contenente almeno una riga di codice per invocare la specifica azione sull’oggetto che rappresenta l’animazione o il MediaElement all’interno dell’interfaccia in sviluppo.&lt;/P&gt;
&lt;P&gt;Per semplificare questo tipo di attività di sviluppo e consentire una rapida interazione per il designer che compone l’interfaccia con gli eventi e le azioni che si vogliono innescare in conseguenza degli eventi stessi in Blend 3 e Silverlight 3 sono stati inseriti i Behaviors come ben ci descrive &lt;A href="http://blogs.msdn.com/designexperience/archive/2009/06/26/expression-blend-beahavior-l-interazione-a-portata-di-click.aspx" target=_blank mce_href="http://blogs.msdn.com/designexperience/archive/2009/06/26/expression-blend-beahavior-l-interazione-a-portata-di-click.aspx"&gt;Roberto sul suo blog&lt;/A&gt; &amp;nbsp;.&lt;/P&gt;
&lt;P&gt;I Behaviors consentono per l’appunto l’esecuzione di specifiche azioni su di un target e sono associabili in modo dichiarativo ad uno specifico evento su un elemento della nostra interfaccia, sia attraverso una dichiarazione espressa con lo XAML sia direttamente dai menù di Blend associati all’elemento che poi implementano la dichiarazione nello XAML su cui si sta lavorando.&lt;/P&gt;
&lt;P&gt;Come si utilizzano i Behaviors ? Come prima cosa occorre referenziare nel progetto su cui si sta lavorando&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image002_2.gif" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image002_2.gif"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image002 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image002_thumb.gif" width=561 height=220 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image002_thumb.gif"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;la DLL che contiene l’implementazione dei Behaviors che vogliamo utilizzare la libreria di base per questa funzionalità che è contenuta per la preview di Blend 3, nella cartella ..Program Files\Microsoft Expression\Blend 3 Preview\Libraries\Silverlight con il nome Microsoft.Expression.Interactivity.dll . Per poter provare potete utilizzare il semplice esempio che ho implementato e che trovate &lt;A href="http://cid-d82de3153feb12ed.skydrive.live.com/self.aspx/Public/SilverlightDownload/SamplesBehaviors.zip" mce_href="http://cid-d82de3153feb12ed.skydrive.live.com/self.aspx/Public/SilverlightDownload/SamplesBehaviors.zip"&gt;qui&lt;/A&gt; per eseguire una animazione. Altri esempi di Behaviors potete scaricarli da &lt;A href="http://gallery.expression.microsoft.com/en-us/SampleSLBehaviors" mce_href="http://gallery.expression.microsoft.com/en-us/SampleSLBehaviors"&gt;http://gallery.expression.microsoft.com/en-us/SampleSLBehaviors&lt;/A&gt; . &lt;/P&gt;
&lt;P&gt;Effettuata questa operazione, selezionando dal menù dei controlli di Blend la Asset Library e da li selezionando la pagina dei Behaviors si potrà selezionare il Behaviors StartAnimation e trascinarlo sul bottone presente nella nostra interfaccia a cui vogliamo associare l’azione.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image004_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image004_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image004 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image004_thumb.jpg" width=495 height=270 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image004_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Fatta questa operazione, vedremo associato al bottone il behavior &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image006_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image006_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image006 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image006_thumb.jpg" width=392 height=219 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image006_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;e potremo configurare con il tab delle proprietà il nome dell’animazione da eseguire. Lo XAML generato per associare il Behaviors sarà il seguente :&lt;/P&gt;
&lt;P&gt;&amp;lt;Button x:Name="button" &amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;i:Interaction.Triggers&amp;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;lt;i:EventTrigger EventName="Click"&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;si:StartAnimation AnimationName="test"/&amp;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;lt;/i:EventTrigger&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/i:Interaction.Triggers&amp;gt;&lt;/P&gt;
&lt;P&gt;…………&lt;/P&gt;
&lt;P&gt;dove i: e si: sono rispettivamente i namespace che corrispondono alla libreria di base dei Behaviors e alla mia libreria che implementa il semplice StartAnimation.&lt;/P&gt;
&lt;P&gt;Attraverso la finestra delle proprietà si potrà impostare le proprietà del Behaviors tra cui il nome della animazione da eseguire sull’evento click del bottone a cui abbiamo associato il Behaviors stesso.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image008_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image008_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image008 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image008_thumb.jpg" width=341 height=359 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image008_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Eseguendo l’applicazione e facendo click sul bottone si eseguirà l’animazione test che dovrà ovviamente essre implementata nello usercontrol in cui si stautilizzando il Behaviors. &lt;/P&gt;
&lt;P&gt;Attraverso le proprietà possiamo anche modificare l’evento del Trigger che decide quando scatenare l’azione collegata al Behaviors come si vede nell’immagine precedente, in quei casi in cui sia esposta questa specifica funzionalità dal Behaviors associato all’elemento. Alcuni Behaviors permettono anche di specificare l’elemento target su cui l’azione associata deve essere eseguita come appunto l’esempio appena visto. E’ anche possibile, associare più Behaviors ad un singolo elemento. &lt;/P&gt;
&lt;P&gt;&lt;B&gt;Implementare i Behaviors&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Per implementare dei nostri Behaviors che possano essere poi utilizzati all’interno di Blend per semplificare il lavoro dello sviluppo dell’interazione con l’applicazione, si possono realizzare delle classi specifiche partendo dalle classi base definite nella libreria principale di questa funzionalità ovvero la dll Microsoft.Expression.Interactivity.dll (nella versione finale di Blend3 e Silverlight 3 il nome della libreria ed alcuni dettagli implementativi potrebbero cambiare).&lt;/P&gt;
&lt;P&gt;Un Behaviors è essenzialmente basato su tre concetti fondamentali : Trigger, Action e Behavior. I Trigger rappresentano uno degli elementi principali del funzionamento dei Behaviors, fornendo l’elemento che scatena l’ Action che poi produce lo specifico Behavior voluto. &lt;/P&gt;
&lt;P&gt;Ad esempio nel caso del nostro Behaviors StartAnimation il Trigger è l’elemento associato al click sul bottone che produce l’innesco dell’azione (start dell’animazione il cui nome è impostato sulla proprietà specifica).&lt;/P&gt;
&lt;P&gt;Per implementare un Trigger o estenderne di esistenti si utilizzando le classi definite nella libreria base citata sopra. Ad esempio per realizzare un nostro Trigger implementeremo una classe BaseBehaviorSample derivando dalla classe base specifica Microsoft.Expression.Interactivity .TriggerBase&amp;lt;DependencyObject&amp;gt; come da esempio:&lt;/P&gt;
&lt;P&gt;&lt;B&gt;public class BaseBehaviorSample : Microsoft.Expression.Interactivity.TriggerBase&amp;lt;DependencyObject&amp;gt; &lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;{&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;&lt;B&gt;}&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Questo tipo di Behaviors può essere associato a qualunque oggetto Silverlight che deriva da DependencyObject e per il momento non implementa nessuna particolare azione. La classe TriggerBase&amp;lt;T&amp;gt;&lt;/P&gt;
&lt;P&gt;public abstract class TriggerBase&amp;lt;T&amp;gt; : TriggerBase where T : System.Windows.DependencyObject&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected TriggerBase();&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected T AssociatedObject { get; }&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected override sealed Type AssociatedObjectTypeConstraint { get; }&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;Deriva a sua volta dalla classe :&lt;/P&gt;
&lt;P&gt;[ContentProperty("Actions")]&lt;/P&gt;
&lt;P&gt;public abstract class TriggerBase : DependencyObject, IAttachedObject&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;public static readonly DependencyProperty ActionsProperty;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;public TriggerActionCollection Actions { get; }&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected DependencyObject AssociatedObject { get; }&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected virtual Type AssociatedObjectTypeConstraint { get; }&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;public void Attach(DependencyObject dependencyObject);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;public void Detach();&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected void InvokeActions(object parameter);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected virtual void OnAttached();&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected virtual void OnDetaching();&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;L’implementazione dalla classe TriggerBase ci permette di effettuare l’override di due importanti metodi che implementa la classe base OnAttached e OnDetaching che corrispondono ai metodi che vengono invocati rispettivamente all’avvio ed al rilascio degli oggetti creati a partire da questa classe che stiamo realizzando. Il metodo InvokeActions è il metodo che invoca le azioni che vengono eventualmente associate al Trigger e la Dependency Property AssociatedObject rappresenta l’elemento a cui è stato associato il Trigger .&lt;/P&gt;
&lt;P&gt;Ad esempio, volendo implementare un Trigger che esegue un’azione sull’evento MouseLeftButtonDown sull’oggetto a cui associamo il trigger scriveremo il seguente codice, agganciando l’evento su cui vogliamo innescare l’azione in OnAttached e rimuovendolo su OnDetaching:&lt;/P&gt;
&lt;P&gt;public class BaseTriggerSample: Microsoft.Expression.Interactivity.TriggerBase&amp;lt;UIElement&amp;gt; &lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void OnAttached()&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;base.OnAttached();&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;this.AssociatedObject.MouseLeftButtonDown += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;this.InvokeActions(null);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected override void OnDetaching()&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;base.OnDetaching();&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;this.AssociatedObject.MouseLeftButtonDown -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;In questo modo è evidente che si possono pensare di implementare un’ampia gamma di Triggers che possono poi essere usati come base per invocare specifiche Action. Ad esempio si possono realizzare dei Triggers che si eseguono nel momento in cui cambia lo stato della rete o su uno specifico timer , l’architettura implementata offre una ampia possibilità di estensione ed utilizzo. &lt;/P&gt;
&lt;P&gt;Oltre ai Trigger di base si possono implementare Behaviors che hanno un’associazione tra Trigger e una Action. Ad esempio derivando dalla classe TriggerAction :&lt;/P&gt;
&lt;P&gt;public abstract class TriggerAction : DependencyObject, IAttachedObject&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;public static readonly DependencyProperty IsEnabledProperty;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected DependencyObject AssociatedObject { get; }&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected virtual Type AssociatedObjectTypeConstraint { get; }&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;[DefaultValue(true)]&lt;/P&gt;
&lt;P&gt;public bool IsEnabled { get; set; }&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;public void Attach(DependencyObject dependencyObject);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;public void Detach();&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected abstract void Invoke(object parameter);&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected virtual void OnAttached();&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;protected virtual void OnDetaching();&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;Questa classe oltre ad avere a disposizione i metodi OnAttached e OnDetaching abbiamo la possibilità di implementare l’ovverride del metodo Invoke che è il metodo che viene invocato nel momento in cui si innesca il trigger. Ad esempio di seguito vediamo un semplice esempio che imposta l’opacity dell’oggetto su cui viene implementato:&lt;/P&gt;
&lt;P&gt;public class BaseTriggerAction : TriggerAction&amp;lt;UIElement&amp;gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static readonly DependencyProperty OpacityProperty = DependencyProperty.Register("Opacity", typeof(double ), typeof(BaseTriggerAction), new PropertyMetadata(0.5)); &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public double Opacity&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return (double )this.GetValue(BaseTriggerAction.OpacityProperty ); }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { this.SetValue(BaseTriggerAction.OpacityProperty , value); }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected override void Invoke(object parameter)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.AssociatedObject.Opacity = this.Opacity ;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;Dall’interfaccia di Blend , quando agganciamo il nostro BaseTriggerAction ad un elemento che deriva da UIElement , ad esempio un bottone:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image010_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image010_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image010 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image010_thumb.jpg" width=389 height=277 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image010_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;possiamo anche selezionare su quale Trigger si deve innescare la Action associata come da immagine:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image012_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image012_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image012 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image012_thumb.jpg" width=340 height=336 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image012_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Specifici attributi con cui possiamo decorare la classe ci consentono di predeterminare l’evento su cui si innesca il Trigger. Ad esempio ammettendo di voler implementare un Behaviors che imposti automaticamente il Trigger a Click nel caso in cui lo colleghiamo ad un elemento che deriva da ButtonBase o all’evento MouseLeftButtonDown nel caso di un elemento UIElement generico, potremo decorare con gli specifici attributi la precedente classe come segue:&lt;/P&gt;
&lt;P&gt;[DefaultTrigger(typeof(ButtonBase), typeof(Microsoft.Expression.Interactivity.EventTrigger), new object[] { "Click" }),&lt;/P&gt;
&lt;P&gt;DefaultTrigger(typeof(UIElement), typeof(Microsoft.Expression.Interactivity.EventTrigger), new object[] { "MouseLeftButtonDown" })]&lt;/P&gt;
&lt;P&gt;public class BaseTriggerAction : TriggerAction&amp;lt;UIElement&amp;gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp; public static readonly DependencyProperty OpacityProperty = DependencyProperty.Register("Opacity", typeof(double ), typeof(BaseTriggerAction), new PropertyMetadata(0.5));&lt;/P&gt;
&lt;P&gt;&amp;nbsp; public double Opacity&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; get { return (double )this.GetValue(BaseTriggerAction.OpacityProperty ); }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; set { this.SetValue(BaseTriggerAction.OpacityProperty , value); }&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;protected override void Invoke(object parameter)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.AssociatedObject.Opacity = this.Opacity ;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;Derivando da TargetedTriggerAction &lt;/P&gt;
&lt;P&gt;public abstract class TargetedTriggerAction&amp;lt;T&amp;gt; : TargetedTriggerAction where T : System.Windows.DependencyObject&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp; protected TargetedTriggerAction();&lt;/P&gt;
&lt;P&gt;&amp;nbsp; protected T Target { get; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; protected virtual void OnTargetChanged(T oldTarget, T newTarget);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;Avremo a disposizione la proprietà Target che si potrà utilizzare per definire l’elemento Target della nostra Azione associata al Behavior. Per esempio, tornando al nostro semplice esempio di configurazione dell’Opacity , si potrà definire attraverso la proprietà Target , l’elemento su cui impostare l’Opacity con l’azione implementata sul metodo Invoke:&lt;/P&gt;
&lt;P&gt;[DefaultTrigger(typeof(ButtonBase), typeof(Microsoft.Expression.Interactivity.EventTrigger), new object[] { "Click" }),&lt;/P&gt;
&lt;P&gt;DefaultTrigger(typeof(UIElement), typeof(Microsoft.Expression.Interactivity.EventTrigger), new object[] { "MouseLeftButtonDown" })]&lt;/P&gt;
&lt;P&gt;public class BaseTargetedTriggerAction : TargetedTriggerAction&amp;lt;UIElement&amp;gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp; public static readonly DependencyProperty OpacityProperty = DependencyProperty.Register("Opacity", typeof(double ), typeof(BaseTargetedTriggerAction), new PropertyMetadata(0.5));&lt;/P&gt;
&lt;P&gt;&amp;nbsp; public double Opacity&lt;/P&gt;
&lt;P&gt;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return (double )this.GetValue(BaseTriggerAction.OpacityProperty); }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { this.SetValue(BaseTriggerAction.OpacityProperty, value); }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; protected override void Invoke(object parameter)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Target.Opacity=this.Opacity ;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;La proprietà Target potrà essere impostata dopo aver associato il BaseTargetedTriggerAction ad un elemento selezionandolo tra i Behaviors disponibili nella Asset Library e trascinandolo sopra l’elemento sull’interfaccia con cui lo si vuole associare, ad esempio un bottone, come già visto sopre per gli altri esempi. Selezionando il Beheviors si prota impostare dalle proprietà anche il Target e all’esecuzione del Trigger (in questo caso il Click sul bottono a cui abbiamo associato il Behavior ) si eseguirà l’azione che imposterà l’Opacity sull’oggetto Target in base al valore della proprietà Opacity del Behaviors.&lt;/P&gt;
&lt;P&gt;Il meccanismo Trigger e Action permette di implementare soluzioni per molte esigenze di interazione sull’interfaccia, ma non soddisfa tutti i possibili scenari. Ad esempio nel caso in cui si voglia realizzare un Behaviors che consenta di impostare il comportamento di un oggetto per il Drag and Drop, occorre l’interazione di un modello Trigger-Action che non è limitato all’associazione di una coppia di questi due elementi, ma occorre la possibilità di costruire una combinazione di Trigger e Action per inserirle sempre in modo dichiarativo per ottenere questo tipo di comportamento. &lt;/P&gt;
&lt;P&gt;Proprio per questo motivo attraverso la derivazione dalla classe Behavior si possono sviluppare Behaviors che implementano azioni specifiche e renderle associabili anche in modo dichiarativo con lo XAML o attraverso Blend ad uno più specifici Trigger, senza definirne l’associazione in modo vincolante come negli esempi delle classi base viste in precedenza. &lt;/P&gt;
&lt;P&gt;Ad esempio implementando un Behaviors nel seguente modo, si consentirà un’enorme flessibilità nell’associare il comportamento a Triggers in modo completamente dichiarativo, fornendo la base per realizzare un’enorme flessibilità sia nello sviluppo delle interfacce che nella possibilità di personalizzazione del template dei controlli.&lt;/P&gt;
&lt;P&gt;Derivando dalla classe Behavior si può implementare le Action attraverso l’implementazione di un’interfaccia ICommand :&lt;/P&gt;
&lt;P&gt;public class BaseSampleBehavior : Behavior&amp;lt;DependencyObject&amp;gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp; public BaseSampleBehavior()&lt;/P&gt;
&lt;P&gt;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.BaseCommand = new ActionCommand(this.ExecCommand );&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; protected override void OnAttached()&lt;/P&gt;
&lt;P&gt;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; base.OnAttached();&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; protected override void OnDetaching()&lt;/P&gt;
&lt;P&gt;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnDetaching();&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; public ICommand BaseCommand&lt;/P&gt;
&lt;P&gt;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; get;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; private set;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp; private void ExecCommand()&lt;/P&gt;
&lt;P&gt;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Behavior") ;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;Associato il Behaviors implementato con un elemento sull’interfaccia si può dalla finestra delle proprietà del Behaviors associare i Triggers che dovranno produrre l’esecuzione del Command. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image014_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image014_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image014 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image014_thumb.jpg" width=392 height=393 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/BehaviorsrenderelinterattivitsempliceinB_F346/clip_image014_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Attraverso questo pattern si possono così implementare Behaviors che permettano di gestire complesse interazioni in termini di Trigger e Action , consentendo anche la gestione di uno stato tra le diverse interazioni, fornendo un ottimo modello per la realizzazione di Behaviors che possano notevolmente semplificare lo sviluppo delle parte di interazione della interfaccia utente della nostra applicazione che dovranno produrre l’esecuzione del Command implementato, fornendo una grandissima flessibilità .&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9804841" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>RAINET Test Live Smooth Streaming in HD for Italian soccer team matches during Confederation Cup</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2009/06/22/rainet-test-live-smooth-streaming-in-hd-for-italian-soccer-team-matches-during-confederation-cup.aspx</link><pubDate>Mon, 22 Jun 2009 17:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9797701</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/9797701.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=9797701</wfw:commentRss><description>&lt;P&gt;How I have introduced in my &lt;A href="http://blogs.msdn.com/giuseppeguerrasio/archive/2009/05/15/move-forward-internet-video-streaming-iis7-media-service-and-smooth-streaming.aspx" mce_href="http://blogs.msdn.com/giuseppeguerrasio/archive/2009/05/15/move-forward-internet-video-streaming-iis7-media-service-and-smooth-streaming.aspx"&gt;previous post&lt;/A&gt; , Smooth Streaming is an innovative technology based on &lt;A href="http://www.iis.net/media" mce_href="http://www.iis.net/media"&gt;IIS Media Services&lt;/A&gt; and Silverlight, which the scope to simplify and make a reality delivering video content at high quality level through Internet up to true HD for Live and VOD. Using this technology &lt;B&gt;RAI.IT&lt;/B&gt;, the internet company of RAI, the Italian broadcast host of FIFA Confederations Cup South Africa 2009, in cooperation with &lt;B&gt;Microsoft Corp., &lt;A href="http://inlethd.com/" mce_href="http://inlethd.com/"&gt;Inlet Technologies&lt;/A&gt; and &lt;A href="http://www.level3.com/" mce_href="http://www.level3.com/"&gt;Level 3 Communications&lt;/A&gt;&lt;/B&gt;, offered exclusively for Italy (video content was geo-blocked to Italian IP) on &lt;B&gt;&lt;A href="http://www.raisport.rai.it/" mce_href="http://www.raisport.rai.it/"&gt;www.raisport.rai.it&lt;/A&gt;&lt;/B&gt; and &lt;A href="http://www.rai.tv/" mce_href="http://www.rai.tv/"&gt;www.rai.tv&lt;/A&gt; free, live Web broadcasting in high definition television quality (720p) of the Italian soccer team matches during the tournament. &lt;/P&gt;
&lt;P&gt;In the next picture an image of the player used during the streaming of the event:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image002_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image002_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=clip_image002 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image002_thumb.jpg" width=551 height=337 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image002_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;RAI.IT use already&amp;nbsp; Smooth Streaming &amp;nbsp;for VOD&amp;nbsp;on RAI TV portal (&lt;A href="http://www.rai.tv/" mce_href="http://www.rai.tv"&gt;http://www.rai.tv&lt;/A&gt;&amp;nbsp;)&amp;nbsp;&amp;nbsp; in the &lt;A href="http://www.rai.it/dl/RaiTV/hd/raitvhd.html?v=1" mce_href="http://www.rai.it/dl/RaiTV/hd/raitvhd.html?v=1"&gt;High Quality area&lt;/A&gt; (not in HD but to 480p) and now starts to adopt this technology for Live sports event.&lt;/P&gt;
&lt;P&gt;Smooth Streaming permit to solve one of the most significant limits in Internet video streaming connected to typical behaviors of the last mile for reproducing High Quality videos with high bitrates.&amp;nbsp; When we think to the way that the content is delivered to the client, we have a lot of parameter that change every second during the client reproduction. In particular bandwidth and CPU power availability conditions change every second and causing a video glitch and buffering during the reproduction of the content, especially for the content at high level of bitrates, generating a poor user experience.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image004_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image004_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=clip_image004 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image004_thumb.jpg" width=593 height=301 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image004_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;During the reproduction of the content Smooth Streaming dynamically detects current network and local PC conditions, and seamlessly switches the video quality of a media file that a Silverlight player receives. Consumers with high-bandwidth connections and newer hardware can experience HD quality streaming, and others with lower bandwidth speeds or older hardware receive an appropriate stream for their conditions, allowing the audience to enjoy an uninterrupted streaming experience with the highest quality possible.&lt;/P&gt;
&lt;P&gt;The original video source was acquired by specific encoders and transformed in a set of separated streams at different quality (one for different bitrates level) based on a contiguous sequence of 2 sec of video chunks, and an XML manifest with the metadata. These streams are published to the client through a set of servers based on IIS7 with &lt;A href="http://www.iis.net/media" mce_href="http://www.iis.net/media"&gt;IIS Media Services &lt;/A&gt;. In Live streaming all the streams are offered to the client via HTTP and archived automatically in a set of file in the storage of the origin servers. Archived files&amp;nbsp; are republished automatically to the client offering DVR capability to the client in addition to Live Stream offer. For the Confederation Cup matches RAI use the new beta version of IIS Media Services that support Live Streaming.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image006_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image006_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=clip_image006 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image006_thumb.jpg" width=575 height=349 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image006_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Video streaming is delivered to the client trough a sequence of HTTP call with REST style and for this reason it is possible leverage all the classic Internet HTTP Cache Infrastructure to increase streaming scalability. &lt;/P&gt;
&lt;P&gt;The client part of the Smooth Streaming based on Silverlight detects current network and local PC conditions, and seamlessly switches the video quality of a media adapting the experience at the actual conditions in the client permitting the best experience possible, eliminating buffer and glitch .&lt;/P&gt;
&lt;P&gt;The streaming starts with the first REST call from the client to the source and the response from the server with a manifest that describe chunks and streams level offered with the streaming. &lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image008_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image008_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=clip_image008 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image008_thumb.jpg" width=608 height=328 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image008_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The client reads this information and in order to start the download of video chunks and initiate video reproduction requesting the chunk with a too low bitrates for first. &lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image010_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image010_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=clip_image010 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image010_thumb.jpg" width=616 height=315 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image010_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;During the download of the first chunk, client code calculate the current bitrates and CPU conditions and in base at this information proceeds with requests of the others chunks, adapting continuously the bitrates of chunks requested.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image012_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image012_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=clip_image012 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image012_thumb.jpg" width=618 height=311 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image012_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;As written before streaming works with a sequence of HTTP client requests with a REST style to a stateless server and this permit to insert the origin server behind a CDN with a classic HTTP Edge Caching, improving in a simple way the scalability of streaming. For the same reason all the intermediate http caching level (for example enterprise intermediate cache , etc ) can act automatically as a cache for our chunk and contributing to the scalability of our solution.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image014_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image014_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=clip_image014 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image014_thumb.jpg" width=644 height=340 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image014_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The client code can offer a lot of services leveraging the capability of the programming platform offered with Silverlight and can consume and presents a lot of contextual data and information with the video. The smooth streaming player element can send back to the server a lot of logging information can be captured using logging functionality of IIS Media Services. It is possible build to service that can permit start and stop of the event and services for control and limit bandwidth consumption from the client.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image016_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image016_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=clip_image016 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image016_thumb.jpg" width=640 height=322 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image016_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;In the client of RAI event we have start and stop control, bandwidth control and list highlights in the match that can permit to navigate and replay in the archive to the most important point of the event quickly. In this picture you can see the highlights box in overlay on the video in the player.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image018_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image018_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=clip_image018 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image018_thumb.jpg" width=548 height=337 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image018_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;highlights&amp;nbsp;future leveragin the fact that all the streams are&amp;nbsp;archived automatically in a set of file in the storage of the origin servers. Archived files&amp;nbsp; are republished automatically to the client offering DVR capability to the client .&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In the case of RAI Confederation Cup streaming the architecture in place for the event is represented in the next picture :&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image020_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image020_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" border=0 alt=clip_image020 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image020_thumb.jpg" width=629 height=405 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RAINETTestLiveSmoothStreaminginHDforItal_EAAF/clip_image020_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The original HDTV 1080i signal in input is encoded in 7 different bitrates streams composed by a contiguous 2 secs video chunks codified in VC-1, created by 2 encoders &lt;I&gt;Spinnaker 7000&lt;/I&gt; from Inlet. Each encoder creates 3-4 streams and synch through the encoders are achieved with a timecode generator in input in the encoders with the source video. Encoders push the streams to an origin server farm in load balancing were the Level3 Communication CDN pull for distribute Live, archive streaming and XAP code and offers these to Silverlight client player published on RAI.IT and RAI.TV portal . &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9797701" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/REST/default.aspx">REST</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Media/default.aspx">Media</category></item><item><title>Download modulare con Silverlight</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2009/05/25/download-modulare-con-silverlight.aspx</link><pubDate>Mon, 25 May 2009 15:07:10 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9640409</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/9640409.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=9640409</wfw:commentRss><description>&lt;p&gt;L&amp;#8217;utilizzo di rich plugin su Internet e nelle intranet come strumento per lo sviluppo di interfacce client sta diventando sempre pi&amp;#249; frequente. L&amp;#8217;introduzione con Silverlight 2 dello sviluppo con .NET e la possibilit&amp;#224; di consumare e aggregare dati provenienti da Web Service in una interfaccia in cui si possono utilizzare controlli e databinding ha allargato le possibilit&amp;#224; di utilizzo anche a quelle classiche applicazioni Intranet di gestione dati. &lt;/p&gt;  &lt;p&gt;La crescita nelle potenzialit&amp;#224; utilizzabili per lo sviluppo e l&amp;#8217;impiego di Silverlight in applicazioni di maggiore complessit&amp;#224; e che implementano una notevole quantit&amp;#224; di funzionalit&amp;#224; e che in alcuni casi comportano in conseguenza un incremento nelle dimensioni del codice compilato che viene prodotto e che deve essere in conseguenza scaricato sul client. &lt;/p&gt;  &lt;p&gt;Con il tradizionale modello di deployment di Silverlight le componenti dell&amp;#8217;applicazione implementata vengono compilate in dll e racchiusi un file compresso che prende l&amp;#8217;estensione .xap che viene utilizzato come contenitore. L&amp;#8217;utilizzo dell&amp;#8217;applicazione &amp;#232; indicato nella pagina client attraverso lo specifico tag object che tra i parametri contiene l&amp;#8217;indicazione del file .xap contenente il codice compilato dell&amp;#8217;applicazione da eseguire che deve essere scaricato e utilizzato nel client.&lt;/p&gt;  &lt;p&gt;Il seguente esempio di tag illustra una tipica implementazione dell&amp;#8217;inserimento di un&amp;#8217;applicazione Silverlight con evidente l&amp;#8217;indicazione dello .xap contenente l&amp;#8217;applicazione:&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;object data=&amp;quot;data:application/x-silverlight-2,&amp;quot; type=&amp;quot;application/x-silverlight-2&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot;&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;quot;source&amp;quot; value=&amp;quot;ClientBin/SilverlightComponent.xap&amp;quot;/&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;quot;onerror&amp;quot; value=&amp;quot;onSilverlightError&amp;quot; /&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;quot;background&amp;quot; value=&amp;quot;white&amp;quot; /&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;quot;minRuntimeVersion&amp;quot; value=&amp;quot;2.0.31005.0&amp;quot; /&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;quot;autoUpgrade&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;a href=&amp;quot;http://go.microsoft.com/fwlink/?LinkID=124807&amp;quot; style=&amp;quot;text-decoration: none;&amp;quot;&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;img src=&amp;quot;http://go.microsoft.com/fwlink/?LinkId=108181&amp;quot; alt=&amp;quot;Get Microsoft Silverlight&amp;quot; style=&amp;quot;border-style: none&amp;quot;/&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;/a&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;/object&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Nel caso di applicazioni pi&amp;#249; corpose i tempi di download del file e di avvio dell&amp;#8217;applicazione possono diventare significativi ed impattare in modo negativo sulla esperienza del&amp;#8217;&amp;#8217;utente nell&amp;#8217;utilizzo dell&amp;#8217;applicazione stessa. Ovviamente si pu&amp;#242; agire sui meccanismi di cache per ridurre al minimo le volte in cui all&amp;#8217;avvio dell&amp;#8217;applicazione la stessa sia scaricata nuovamente nel client. Con questo tipo di tecnica per il deployment per&amp;#242; , si riduce il problema , ma non si eliminano comunque i tempi necessari nei casi in cui a seguito di una modifica o all&amp;#8217;avvia su una nuova macchina dell&amp;#8217;applicazione deve essere scaricato l&amp;#8217;intero .xap.&lt;/p&gt;  &lt;p&gt;Per gestire questo tipo di situazioni &amp;#232; inoltre possibile utilizzare alcuni parametri che consentono di mostrare delle animazioni personalizzate durante lo scaricamento dello .xap. Attraverso il parametro splashscreensource del tag object utilizzato per istanziare nella pagina l&amp;#8217;applicazione &amp;#232; infatti possibile introdurre un file .xaml con una grafica personalizzata e ricevere con delle callback Java Script onSourceDownloadProgressChanged e onSourceDownloadComplete le informazioni sullo stato di avanzamento del download dello xap in maniera da permettere lo sviluppo di una interfaccia personalizzata, per gestire in modo pi&amp;#249; efficace la comunicazione versol&amp;#8217;utente durante il download dell&amp;#8217;applicazione.&lt;/p&gt;  &lt;p&gt;In particolare nel seguente tag abbiamo un esempio di come sia possibile configurare questa funzionalit&amp;#224;:&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;object data=&amp;quot;data:application/x-silverlight-2,&amp;quot; type=&amp;quot;application/x-silverlight-2&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot;&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;quot;source&amp;quot; value=&amp;quot;ClientBin/SilverlightComponent.xap&amp;quot;/&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;quot;onerror&amp;quot; value=&amp;quot;onSilverlightError&amp;quot; /&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;quot;background&amp;quot; value=&amp;quot;white&amp;quot; /&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;quot;minRuntimeVersion&amp;quot; value=&amp;quot;2.0.31005.0&amp;quot; /&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;quot;autoUpgrade&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;#8221;splashscreensource&amp;#8221; value=&amp;#8221;SplashScreen.xaml&amp;#8221;/&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;#8221;onSourceDownloadProgressChanged&amp;#8221; value=&amp;#8221;onSourceDownloadProgressChanged&amp;#8221; /&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;param name=&amp;#8221;onSourceDownloadComplete&amp;#8221; value=&amp;#8221;onSourceDownloadProgressChanged&amp;#8221; /&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;a href=&amp;quot;http://go.microsoft.com/fwlink/?LinkID=124807&amp;quot; style=&amp;quot;text-decoration: none;&amp;quot;&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;img src=&amp;quot;http://go.microsoft.com/fwlink/?LinkId=108181&amp;quot; alt=&amp;quot;Get Microsoft Silverlight&amp;quot; style=&amp;quot;border-style: none&amp;quot;/&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;/a&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;/object&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Attraverso il parametro splashscreensource ho impostato una grafica in xaml che Silverlight mostrer&amp;#224; durante il tempo di caricamento e attraverso le due callback provveder&amp;#242; a pilotare l&amp;#8217;aggiornamento dello stato di download dell&amp;#8217;interfaccia mostrata all&amp;#8217;utente durante il download.&lt;/p&gt;  &lt;p&gt;Ad esempio nel file splashscreen.xaml si potr&amp;#224; mostrare una grafica simile a quella riportata di seguito:&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;Canvas     &lt;br /&gt;&amp;#160;&amp;#160; xmlns=&amp;#8221;&lt;/i&gt;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation%22"&gt;&lt;i&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;#8221;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;     &lt;br /&gt;&amp;#160;&amp;#160; xmlns:x=&amp;#8221;&lt;/i&gt;&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml%22"&gt;&lt;i&gt;http://schemas.microsoft.com/winfx/2006/xaml&amp;#8221;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;     &lt;br /&gt;&amp;#160;&amp;#160; Width=&amp;#8221;550&amp;#8243; Height=&amp;#8221;550&amp;#8243;&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;Grid&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;TextBlock Text=&amp;#8221;Loading: 0%&amp;#8221; x:Name=&amp;#8221;testo&amp;#8221;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/Grid&amp;gt;      &lt;br /&gt;&amp;lt;/Canvas&amp;gt;&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;E con le due seguenti funzioni si potr&amp;#224; cos&amp;#236; modificare il contenuto della interfaccia utente in base allo stato di avanzamento:&lt;/p&gt;  &lt;p&gt;&lt;i&gt;function onSourceDownloadProgressChanged(sender, eventArgs)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sender.findName(&amp;#8221;testo&amp;#8221;).Text =&amp;#160; &amp;#8220;Loading: &amp;#8221; + Math.round((eventArgs.progress * 1000)) / 10 + &amp;#8220;%&amp;#8221;;      &lt;br /&gt;}&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;function onSourceDownloadComplete(sender, eventArgs)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; sender.findName(&amp;#8221;testo&amp;#8221;).Text =&amp;#160; &amp;#8220;Completed&amp;#8221;;      &lt;br /&gt;}&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Questo tipo di tecnica consente di gestire in modo pi&amp;#249; efficace l&amp;#8217;interazione con l&amp;#8217;utente ma non elimina il tempo di attesa per quei casi in cui abbiamo applicazioni corpose che devono essere scaricate nel client.&lt;/p&gt;  &lt;p&gt;Oltre alla modalit&amp;#224; di deployment classica che abbiamo visto, Silverlight consente di effettuare il download ed il caricamento di componenti aggiuntive preparate in xap differenti durante l&amp;#8217;esecuzione dell&amp;#8217;applicazione. Questo consente di poter pensare la propria applicazione differenti componenti che verranno poi compilati ed inseriti in xap differenti. Il componente principale conterr&amp;#224; la parte di startup dell&amp;#8217;applicazione e sar&amp;#224; quello che verr&amp;#224; indicato nel tag source inserito nella pagina web. &lt;/p&gt;  &lt;p&gt;Durante l&amp;#8217;esecuzione di questo primo componente, verranno caricati su richiesta nel momento in cui occorrono per l&amp;#8217;esecuzione dell&amp;#8217;applicazione , le restanti componenti. &lt;/p&gt;  &lt;p&gt;Questo tipo di modello consente di scomporre l&amp;#8217;applicazione in componenti diverse modulando i tempi di caricamento ed avvio dell&amp;#8217;applicazione stessa.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/DownloadmodulareconSilverlight_C650/clip_image002_2.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="clip_image002" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/DownloadmodulareconSilverlight_C650/clip_image002_thumb.jpg" width="244" height="111" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Silverlight consente, infatti, di caricare a runtime componenti aggiuntive ed eseguirle. Lo scaricamento sul client del componente aggiuntivo pu&amp;#242; essere effettuato attraverso la classe WebClient . Terminato lo scaricamento si pu&amp;#242; estrarre l&amp;#8217;oggetto dallo xap o dalla dll scaricata utilizzando delle classi Assembly ed AssemblyPart.&lt;/p&gt;  &lt;p&gt;Nel seguente frammento di codice ho riportato un esempio di download e caricamento di un oggetto Silverlight da un componente esterno allo xap dell&amp;#8217;applicazione. Come primo passo si utilizza il WebClient per effettuare il download del componente satellite:&lt;/p&gt;  &lt;p&gt;&lt;i&gt;WebClient client = new WebClient();&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;client.DownloadStringCompleted += &lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;new DownloadStringCompletedEventHandler(OnDownloadCompleted);&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;Uri uri = new Uri( &amp;#8230;url del componente satellite.. , UriKind.Relative);&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;client.DownloadStringAsync(uri);&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Sulla callback chiamata al termine del download si procede a creare un istanza dell&amp;#8217;oggetto e ad esempio aggiungerla come Child al contenitore dove dovr&amp;#224; essere visualizzata:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;void OnDownloadCompleted(object sender, DownloadStringCompletedEventArgs e)&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;{&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;// caricamento dell&amp;#8217;assembly dallo XAP package dove e &amp;#232; l&amp;#8217;args della callback del web client&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;Assembly ass = GetAssemblyFromXap(nomeAssembly, e.Result);&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;// Creazione istanza object&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;object component = ass.CreateInstance(className); &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;UserControl componentControl = component as UserControl;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;// Caricamento come child di un contenitore&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;contenitore.Children.Clear();&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;contenitore.Children.Add(componentControl); &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Assembly GetAssemblyFromXap(string assemblyName, Stream xap)&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;{&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Uri assemblyUri = null;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;StreamResourceInfo resPackage = null;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;StreamResourceInfo resAssembly = null;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;AssemblyPart part = null;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;assemblyUri = new Uri(assemblyName, UriKind.Relative);&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;resPackage = new StreamResourceInfo(xap, null);&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;resAssembly = Application.GetResourceStream(resPackage, assemblyUri);&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;//Estrae l&amp;#8217;assembly &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;part = new AssemblyPart();&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Assembly a = part.Load(resAssembly.Stream);&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;return a; &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;In modo similare &amp;#232; anche possibile scaricare ed visualizzare dei file xaml. In questo caso terminato lo scaricamento del file contenente lo xaml nella funzione di callback del webclient si pu&amp;#242;:&lt;/p&gt;  &lt;p&gt;&lt;b&gt;void OnDownloadCompleted(object sender, DownloadStringCompletedEventArgs e)&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;{&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;// Parsing e costruzione oggetti UI dallo XAML &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;string xaml = e.Result;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;UIElement uiObjects = XamlReader.Load(xaml) as UIElement;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;// Append to the DOM&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;contenitore.Children.Clear();&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;contenitore.Children.Add(uiObjects);&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;}&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Sfruttando questo tipo di funzionalit&amp;#224; disponibile per il deployment in SL diventa semplice scomporre in componenti l&amp;#8217;applicazione e permettere una migliore gestione del download delle risorse necessarie al funzionamento dell&amp;#8217;applicazione stessa implementando ad esempio pattern come il LazyLoad (&lt;a href="http://en.wikipedia.org/wiki/Lazy_loading"&gt;http://en.wikipedia.org/wiki/Lazy_loading&lt;/a&gt; ) per gestire il caricamento su richiesta delle componenti.&lt;/p&gt;  &lt;p&gt;Per poter gestire con pi&amp;#249; semplicit&amp;#224; il caricamento delle componenti e stabilire una semplice suddivisione della applicazione un possibile approccio consiste nell&amp;#8217;implementare i diversi componenti satellite come Sliverlight Control e nel gestire come Applicazione solo la componente principale che si occuper&amp;#224; di caricare il men&amp;#249; delle funzioni applicative e l&amp;#8217;infrastruttura di base utilizzata per la gestione dello stato e per il caricamento delle componenti che implementano le singole funzionalit&amp;#224;.&lt;/p&gt;  &lt;p&gt;Allo scopo di consentire anche un utilizzo trasparente del caricamento a richiesta delle componenti aggiuntive &amp;#232; utile sviluppare un controllo che consenta di rendere trasparente questa operazione rispetto allo sviluppo delle funzionalit&amp;#224; dell&amp;#8217;applicazione stessa.&lt;/p&gt;  &lt;p&gt;Ad esempio immaginando un&amp;#8217;applicazione che presenta un men&amp;#249; di funzionalit&amp;#224; ciascuna implementata attraverso una delle componenti satellite, pu&amp;#242; essere utile implementare un controllo da inserire nello UserControl principale dell&amp;#8217;applicazione che attraverso la semplice modifica di alcuni parametri , provveda automaticamente a caricare ed eseguire, inserendo nello spazio in cui il controllo e inserito nell&amp;#8217; applicazione principale , gli elementi del componente satellite impostati sulle propriet&amp;#224; . Ad esempio nel seguente frammento di xaml abbiamo una Grid con all&amp;#8217;interno il controllo con le propriet&amp;#224; impostate all&amp;#8217;interno del quale verr&amp;#224; visualizzato lo UserControl TestComponente, estratto dallo xap TestComponente:&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;StackPanel Grid.Row=&amp;quot;1&amp;quot; x:Name=&amp;quot;contenitore&amp;quot;&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;c:ComponentLoaderControl&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;c:ComponentLoaderControl.ComponentInfo&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;c:ComponentInfo ComponentXapUrl=&amp;quot;TestComponent.xap&amp;quot; ComponentAssembly=&amp;quot;TestComponent.dll&amp;quot; ComponentControl=&amp;quot;TestComponent.Page&amp;quot; /&amp;gt; &lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;/c:ComponentLoaderControl.ComponentInfo&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;/c:ComponentLoaderControl&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&amp;lt;/StackPanel&amp;gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Un controllo di questo genere oltre a gestire con semplicit&amp;#224; il meccanismo di Download e caricamento dei componenti aggiuntivi, potrebbe occuparsi di gestire sia gli eventuali errori di download o caricamento del componente aggiuntivo sia i feedback verso l&amp;#8217;utente relativi agli errori e alla grafica necessaria a comunicare lo stato di download del componente aggiuntivo.&lt;/p&gt;  &lt;p&gt;Un controllo di questo tipo potrebbe essere implementato attraverso un customcontrol di Silverlight in maniera da ottenere un componente facilmente riutilizzabile in pi&amp;#249; applicazioni.&lt;/p&gt;  &lt;p&gt;Come esempio ho realizzato un prototipo di customcontrol che implementa questa funzionalit&amp;#224; da utilizzare come base per realizzare un componente di questo tipo nelle vostre applicazioni e che potete scaricare da &lt;a href="http://cid-d82de3153feb12ed.skydrive.live.com/self.aspx/Public/SilverlightDownload/SilverlightComponent.zip"&gt;qui&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9640409" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Move Forward Internet video streaming: IIS7 Media Service and Smooth Streaming</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2009/05/15/move-forward-internet-video-streaming-iis7-media-service-and-smooth-streaming.aspx</link><pubDate>Fri, 15 May 2009 13:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9618308</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/9618308.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=9618308</wfw:commentRss><description>&lt;P&gt;Delivering video content through Internet is one of the hottest technical topics. The increase of bandwidth and connectivity in combination with the numbers from the last big video event delivered like Olympics, demonstrate the potential of Internet channel for this type of content. In the 2008 Summer Olympics Games in Beijing, NBCOlympics.com attracted close to 6½ million users daily, who, on average, stayed more than 13 minutes per visit and spent more than 27 minutes when consuming video. In total, users watched more than 6 million hours of video content or 60 million video streams, which represent a 5-fold and 20-fold increase compared to the Torino and Athens games combined. Another big difference that the last Olympic on line demonstrate it is relative, not only to the number of users, but also to the viewing time. In the past, online video consumption was limited to “snippets” of video, now the prolonged viewing indicates that users enjoy the experience and find the image and sound quality acceptable. &lt;/P&gt;
&lt;P&gt;Worldwide, billions of videos are viewed online every month. This type of trend are confirmed to a lot of service that came up on the market with success in the previous months like BSKYB channels offering or the new version of Netflix service and many others.&lt;/P&gt;
&lt;P&gt;Setting up an online video service was a complex undertaking and fraught with difficulties, and the process of preparing, loading, and delivering multimedia content, combined with the serving of appropriate advertising, required a lot of manual work and did not really scale very well. In particular “delivering” video content at good or high level of quality through Internet connection is not a simple thing. A lot of details and technical issues are involved on this and build a solution for this and monetize the result is really complex.&lt;/P&gt;
&lt;P&gt;In the last NAB conference Microsoft announce a first Release of new technology called Smooth Streaming based on &lt;A href="http://www.iis.net/media" target=_blank mce_href="http://www.iis.net/media"&gt;IIS7 Media Services&lt;/A&gt; and Silverlight, which the scope to simplify and make a reality delivering video content at high quality level through Internet up to true HD for Live and VOD. You can see&amp;nbsp; &lt;A href="http://www.smoothhd.com/" mce_href="http://www.smoothhd.com"&gt;this web site from akamai &lt;/A&gt;an example of HD content delivered with smooth streaming and &lt;A href="http://www.iis.net/media" mce_href="http://www.iis.net/media"&gt;at this website&lt;/A&gt; you can found others technical information about this technology.&lt;/P&gt;
&lt;P&gt;In the previous months before this announcement I had the opportunity to test and build a real production environment based on this technology, inside a new Web TV portal of RAI – Radio Televisione Italiana ( &lt;A href="http://www.rai.tv/" mce_href="http://www.rai.tv"&gt;http://www.rai.tv&lt;/A&gt; ) . In the new version of this web site recently released there is a new area based on this smooth streaming technology with &lt;A href="http://www.rai.it/dl/RaiTV/hd/raitvhd.html?v=1" mce_href="http://www.rai.it/dl/RaiTV/hd/raitvhd.html?v=1"&gt;fiction&lt;/A&gt;, &lt;A href="http://www.rai.it/dl/RaiTV/hd/raitvhd.html?v=2" mce_href="http://www.rai.it/dl/RaiTV/hd/raitvhd.html?v=2"&gt;sport&lt;/A&gt; and &lt;A href="http://www.rai.it/dl/RaiTV/hd/raitvhd.html?v=3" mce_href="http://www.rai.it/dl/RaiTV/hd/raitvhd.html?v=3"&gt;junior&lt;/A&gt; videos. Content from RAI website have a good quality but is not HD content because the original produced video&amp;nbsp; is not HD. Based on this experience I want write some post on this new fantastic technology that can permit to deliver uninterrupted video streaming to Silverlight clients at High Quality, via HTTP in VOD and delivers massively scalable Smooth Streaming for live events.&lt;/P&gt;
&lt;P&gt;Smooth Streaming&amp;nbsp; permit to solve one of the most significant limits in Internet video streaming connected to typical behaviors of the last mile for reproducing High Quality videos with high bitrates.&amp;nbsp; When we think to the way that the content is delivered to the client, we have a lot of parameter that change every second during the client reproduction. In particular bandwidth and CPU power availability conditions change every second and causing a video glitch and buffering during the reproduction of the content, especially for the content at high level of bitrates, generating a poor user experience .&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image002_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image002_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image002 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image002_thumb.jpg" width=677 height=340 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image002_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Before to go in deep in Smooth Streaming technology and in order to explain difference and advantage that come with this new streaming technique I want recap the typical way used to delivery video content through Internet. Before the smooth streaming you can use essentially two different way for delivering video content:&lt;/P&gt;
&lt;P&gt;- Progressive Download&lt;/P&gt;
&lt;P&gt;- Traditional Streaming (RTSP, streaming through HTTP, RTMP, etc)&lt;/P&gt;
&lt;P&gt;Both approaches have pros and cons and smooth streaming try to combine the best of the previous techniques. &lt;/P&gt;
&lt;P&gt;&lt;B&gt;When you use Progressive Download to delivery video content&lt;/B&gt; you essentially leverage the capability of Web Server to delivery file. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image004_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image004_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image004 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image004_thumb.jpg" width=738 height=304 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image004_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The Web Server receive a request for a specific URL for the video content and the web server start to deliver the file to the client via classic HTTP. &lt;/P&gt;
&lt;P&gt;Big advantages of this solution are:&lt;/P&gt;
&lt;P&gt;- simplicity of the approach ;&lt;/P&gt;
&lt;P&gt;- not required a specialized server;&lt;/P&gt;
&lt;P&gt;- leveraging all HTTP infrastructure in terms of caching and distribution.&lt;/P&gt;
&lt;P&gt;Problems connected to this solution are:&lt;/P&gt;
&lt;P&gt;- Bandwidth controls;&lt;/P&gt;
&lt;P&gt;- Security of content;&lt;/P&gt;
&lt;P&gt;- Limited user tracking;&lt;/P&gt;
&lt;P&gt;- Poor user experience (no seeking feature on classic web server);&lt;/P&gt;
&lt;P&gt;- VOD video content only.&lt;/P&gt;
&lt;P&gt;In general the most significant problem of this approach is about bandwidth consumption. In fact the web server delivers the video content to the cache of the client without any type of control or limitation leveraging all the bandwidth available.&lt;/P&gt;
&lt;P&gt;You can improve efficiency of progressive download through system that can permit the control of bandwidth and offering control and seeking capabilities. IIS7 Media Services enabled this feature too called &lt;A href="http://www.iis.net/extensions/BitRateThrottling" mce_href="http://www.iis.net/extensions/BitRateThrottling"&gt;Intelligent bit rate throttling&lt;/A&gt;. This feature is available for the most used type of media content, and permit to reduce bandwidth consumption saves money on network costs by metering the download speed of multiple media file types as well as data. Intelligent Bit Rate Throttling accomplishes this by automatically detecting the encoded bit rates of 11 common media formats, such as Windows Media Video (WMV), Flash Video (FLV), and MPEG 4 (MP4), and then throttling the response to the client. Bit Rate Throttling and allows administrators to configure throttling rules for all file and MIME types.&lt;/P&gt;
&lt;P&gt;With this technique you could obtain more efficiency for bandwidth consumption and simplicity in the delivery but remaining a lot of limitations. For example, in the case of the user put in pause the reproduction the download proceeds consuming bandwidth; in this way we can use of a single bitrates for reproduction or complex variable bitrates technique with poor efficiency , and remaining the problem illustrated before about the last mile and client reproduction, in particular for content with high quality and consequent high bitrates.&lt;/P&gt;
&lt;P&gt;&lt;B&gt;When you use classical streaming&lt;/B&gt; you use a specialized server to delivery to the client only the portion of the stream involved in the reproduction of the video in base of the command received from the client.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image006_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image006_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image006 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image006_thumb.jpg" width=790 height=315 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image006_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Big advantages of this solution are:&lt;/P&gt;
&lt;P&gt;- Efficiency in control and delivery of content ;&lt;/P&gt;
&lt;P&gt;- Simple way to track user activity;&lt;/P&gt;
&lt;P&gt;- Good user experience (seeking, forward, etc);&lt;/P&gt;
&lt;P&gt;- Good for VOD and Live .&lt;/P&gt;
&lt;P&gt;Problems connected to this solution are:&lt;/P&gt;
&lt;P&gt;- Required specialized services ;&lt;/P&gt;
&lt;P&gt;- Not cache in HTTP CDN;&lt;/P&gt;
&lt;P&gt;- Scalability required a specialized network .&lt;/P&gt;
&lt;P&gt;In general the most significant problem of this approach is about scalability. In order have a large distribution of video content is necessary achieve a specialized infrastructure of server with a specific streaming services. Is not possible reuse the big cache infrastructure that we have in place on Internet today for HTTP . In order to delivery this type streaming, Windows Server offers a good platform through the &lt;A href="http://www.microsoft.com/windows/windowsmedia/forpros/serve/prodinfo2008.aspx" mce_href="http://www.microsoft.com/windows/windowsmedia/forpros/serve/prodinfo2008.aspx"&gt;Windows Media Services&lt;/A&gt; today available for Windows Server 2008.&lt;/P&gt;
&lt;P&gt;When you use Smooth Streaming now available in beta with &lt;A href="http://www.iis.net/media" mce_href="http://www.iis.net/media"&gt;IIS7 Media Services&lt;/A&gt; , you have the capability to deliver media at variables bit rates to Silverlight clients over HTTP combining the advantage of streaming and progressive download and adding capability of adapt the bit rates at the real situation in the last mile in terms of bandwidth and CPU.&lt;/P&gt;
&lt;P&gt;With the Smooth Streaming you deliver video content starting from a set of specific encoded file with different bit rates level. During the encoding phase, realizable today for VOD (with Expression Encoder 2 SP1 with adaptive streaming encoding profile) or for live using a specialized encoder from an encoders vendor, you obtain the source files to stream. You can choose a set of different bitrates and obtaining a set of N file one for every level of bit rates that you have selected in the profile and a xml manifest with the metadata for server and an xml file for client. You can choose at maximum of 10 different bit rates. The manifest files are used from the server and from the client to understand level of bitrates available for streaming and others information relative to the media content. &lt;/P&gt;
&lt;P&gt;A typical Smooth Streaming media asset (presentation) consists of the following files: &lt;/P&gt;
&lt;P&gt;MP4 files containing video/audio &lt;/P&gt;
&lt;P&gt;- &lt;B&gt;*.ismv &lt;/B&gt;Contains video and audio, or only video (one file ISMV file per encoded video bit rate )&lt;/P&gt;
&lt;P&gt;- &lt;B&gt;*.isma &lt;/B&gt;Contains only audio &lt;/P&gt;
&lt;P&gt;Server manifest file &lt;/P&gt;
&lt;P&gt;- &lt;B&gt;*.ism -&lt;/B&gt;Describes the relationships between the media tracks, bit rates and files on disk . Used by IIS Media Services Server&lt;/P&gt;
&lt;P&gt;Client manifest file &lt;/P&gt;
&lt;P&gt;- &lt;B&gt;*.ismc - &lt;/B&gt;first file delivered to the client. Describes the available streams to the client: bitrates level available, codecs used, video resolutions, markers, captions, etc. &lt;/P&gt;
&lt;P&gt;For live streaming the same structure is created in the archive of event and client manifest is generated at runtime from encoding available. Origin Media Server can archive all live streaming and offer DVR capability to the client.&lt;/P&gt;
&lt;P&gt;In every video\audio file (ismv , isma) you have a contiguous sequence of video chunks at fixed time length (default 2 sec) based on the ISO/IEC 14496-12 ISO Base Media File Format specification, better known as the MP4 file specification . There are actually two parts to the Smooth Streaming format: the wire format, and the disk file format. In Smooth Streaming, a video is recorded in full length to the disk as a single file (one file per encoded bit rate), but it's transferred to the client as a series of small file chunks. The wire format defines the structure of the chunks that are sent by IIS to the client, whereas the file format defines the structure of the contiguous file on disk, enabling better file management. The MP4 specification is perfect for this because allows MP4 to be internally organized as a series of fragments, which means that in Smooth Streaming the wire format is a direct subset of the file format. Every fragment is delivered to the client through HTTP and in this way can be leverage all the HTTP caching infrastructure of Internet.&lt;/P&gt;
&lt;P&gt;For VOD and for Live the content are published through IIS Media Service using Windows Server 2008 and IIS7 with IIS Media services Extensions. &lt;/P&gt;
&lt;P&gt;During the delivery of the content, the client, in order to reproduce the video, sends a set of specific requests to the server to download the video and audio chunks. In every request for a single chunk, the client specifies level of bit rates and timeframe required in base of the current condition of bandwidth and CPU and position in content reproduction. In this way smooth streaming is delivered with a set of progressive download of video and audio chunks. &lt;/P&gt;
&lt;P&gt;The client send a set of HTTP GET request in REST style like this : &lt;I&gt;http://smoothstreaming.com/title.ism/QualityLevels(1775000)/Fragments(video=840000000) &lt;/I&gt;that contains information about bit rates and timeframe requested for the chunk . This type of request is a typical HTTP request and is it possible leverage all the http infrastructure on Internet in order to cache this content to near as possible at the client and using a typical http edge offered from a CDN. &lt;/P&gt;
&lt;P&gt;A specific part of code downloaded in the client contains the Heuristic Algorithms that drive the requests of chunks. The process start with the base request from the client at the client manifest file on the server in order to obtain the metadata that can guide the behavior of the client. This request have this format : &lt;I&gt;http://smoothstreaming.com/title.ism/Manifest&lt;/I&gt;, IIS receive the request send manifest client in response. In the next picture you can see a typical client manifest response with the indication of the bit rates available for the content downloads.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image008_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image008_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image008 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image008_thumb.jpg" width=779 height=369 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image008_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The client manifest can contains more information about media metadata like : codecs, Text streams, Multi-language audio tracks, Alternate video and audio tracks (for example, multiple camera angles, director's commentary, etc.), Multiple hardware profiles (for example, a bit rate targeted at different playback devices) , Script commands, markers/chapters, captions &lt;/P&gt;
&lt;P&gt;The process continue with the request of the first chunk video and audio, requested with the low bit rates available in the manifest with a REST style call described before . The IIS Media Service Module receive the request and use a server manifest file to determine the file to load in base of the request bitrates and provides to the right chunk of video. In the next picture you can see a sample of server manifest file with the indication of file for bitrates:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image010_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image010_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" border=0 alt=clip_image010 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image010_thumb.jpg" width=545 height=387 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/MoveForwardInternetvideostreamingIIS7Med_B10B/clip_image010_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;For the successive request based on download speed, the client can detect available bandwidth and requesting the right bit rates in base of the current situation of bandwidth and CPU. In this way the smooth streaming have the capability of adapt continuously creating an immersive User Experience. The process Work in a similar way for Live and VOD streaming and during the delivery of the video chunk through Internet, all the HTTP caching infrastructure of the network can be leverage in order to improve scalability in particular for Live Streaming. In the case of Live Smooth Streaming the Origin media server can archive the content produced from the encoder and offering DVR capability too during the Live Streaming. &lt;/P&gt;
&lt;P&gt;There is a lot of advantage in this approach respect to traditional streaming technique. In traditional streaming, the client state is managed both by the client and the server. The server keeps a record of each client for things such as playback state, streaming position, selected bit rate (if multiple bit rates are supported), etc. While this gives the streaming server more control, it also adds overhead to the server. In terms of scalability another important limitation is about the fact that each client has to maintain the server affinity throughout the streaming session. &lt;/P&gt;
&lt;P&gt;With the pull model in VOD or Live Smooth Streaming, the server is stateless, the client drive the process and has the responsibility for the state and this fact increase scalability and remove any single point of failure. Any client request can be satisfied by any server configured and the network topology can leverage a stateless infrastructure and can reroute the client requests to the best server. In this way we have a big improvement in:&lt;/P&gt;
&lt;P&gt;- quality because all the decisions, resulting in a much faster response (for example bit rate switching) offering a superior UX :&lt;/P&gt;
&lt;P&gt;- reproduction start fast because the client select the low bitrates and can download in parallel more chunks, potentially cached from the most near web server &lt;/P&gt;
&lt;P&gt;- bitrates are continuously adapted at the real situation in the last mile in terms of bandwidth and CPU status&lt;/P&gt;
&lt;P&gt;- requests can be served from different servers without affinity or persistent connection improving scalability and fault-tolerance&lt;/P&gt;
&lt;P&gt;- scalability because you can leverage a simple, efficient and load balanced HTTP infrastructure to deliver video content&lt;/P&gt;
&lt;P&gt;- cost because you can leverage an HTTP CDN with generic web server with low number of specialized server and leverage all the HTTP cache ( for example intermediate proxy )&lt;/P&gt;
&lt;P&gt;Al the URL obfuscation technique can be used to protect the content and is announce the support of Playready content protection encryption in order to protect smooth streaming for Live and for VOD.&lt;/P&gt;
&lt;P&gt;Smooth streaming enable a new video delivery mechanism that can permit to stream HD content in VOD and Live through Internet with a cool UX . &lt;/P&gt;
&lt;P&gt;In next posts we can see in more details the three phase for create and publish content with this technology .&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9618308" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/IIS7/default.aspx">IIS7</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Media/default.aspx">Media</category></item><item><title>Silverlight e le nuove applicazioni RIA: Servizi per l'Healthcare</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/05/08/silverlight-e-le-nuove-applicazioni-ria-servizi-per-l-healthcare.aspx</link><pubDate>Thu, 08 May 2008 15:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8470221</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8470221.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8470221</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/SilverlightelenuoveapplicazioniRIAServiz_83E0/clip_image001%5B3%5D.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/SilverlightelenuoveapplicazioniRIAServiz_83E0/clip_image001%5B3%5D.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; MARGIN: 0px 5px 0px 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=256 alt=clip_image001[3] src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/SilverlightelenuoveapplicazioniRIAServiz_83E0/clip_image001%5B3%5D_thumb.jpg" width=339 align=left border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/SilverlightelenuoveapplicazioniRIAServiz_83E0/clip_image001%5B3%5D_thumb.jpg"&gt;&lt;/A&gt;Nelle scorse settimane&amp;nbsp; ho fatto un &lt;A href="http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/16/silverlight-e-le-nuove-interfacce-per-i-servizi-finanziari.aspx" target=_blank mce_href="http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/16/silverlight-e-le-nuove-interfacce-per-i-servizi-finanziari.aspx"&gt;post&lt;/A&gt; relativo ad una applicazione di esempio per il mondo finaziario sviluppata in Silverlight 2 che evidenzia come la possibilità di sfruttare le potenzialità delle nuove tecnologie per lo sviluppo di interfacce RIA (Rich Interactive Application) possa essere&amp;nbsp;utilizzata a vantaggio di qualunque tipologia di applicazione. Da ieri è disponibile online una nuova serie di esempi per la sanità &lt;A href="http://www.mscui.net/PatientJourneyDemonstrator/" target=_blank mce_href="http://www.mscui.net/PatientJourneyDemonstrator/"&gt;Microsoft Health Common User Interface (MSCUI) Patient Journey Demonstrator&lt;/A&gt; che dimostrano come anche in questo settore le potenzialità delle nuove tecnologie&amp;nbsp; possono essere utilizzate per costruire una nuova generazione di applicazioni, evidenziando le qualità di Silverlight come piattaforma di sviluppo.&lt;/P&gt;
&lt;P&gt;Si tratta di una implementazione di esempio per un&amp;nbsp;progetto piu ampio&amp;nbsp;per il settore dell'Healtcare: Il &lt;A href="http://www.mscui.net/" target=_blank mce_href="http://www.mscui.net/"&gt;Microsoft Health Common User Interface (CUI)&lt;/A&gt;&amp;nbsp;. L'iniziativa,&amp;nbsp;sviluppata in UK,&amp;nbsp; ha lo scopo di contribuire alla costruzione di una User Interface Design Guidance&amp;nbsp; per le applicazioni in questo settore, completa di un Toolkit di controlli che indirizza una ampia gamma di scenari , abilitando la costruzione di una nuova generazione di applicazioni, più semplici da usare e più efficaci rispetto alla loro funzione nel campo sanità .&lt;/P&gt;
&lt;P&gt;Disponibili oltre allo scenario anche il documento di&amp;nbsp; &lt;A href="http://www.mscui.net/DesignGuide/DesignGuide.aspx" mce_href="http://www.mscui.net/DesignGuide/DesignGuide.aspx"&gt;Design Guidance&lt;/A&gt;&amp;nbsp; e il &lt;A href="http://www.mscui.net/ControlsAndSamples.aspx" mce_href="http://www.mscui.net/ControlsAndSamples.aspx"&gt;Toolkit con i controlli ed esempi&lt;/A&gt; realtivi all'iniziativa&amp;nbsp; che possono essere &lt;A href="http://www.codeplex.com/mscui/Release/ProjectReleases.aspx" target=_blank mce_href="http://www.codeplex.com/mscui/Release/ProjectReleases.aspx"&gt;scaricati&lt;/A&gt; e installati per utilizzarli con Microsoft Visual Studio. Disponibile anche&amp;nbsp; la &lt;A href="http://www.mscui.net/Roadmap/Roadmap.aspx" mce_href="http://www.mscui.net/Roadmap/Roadmap.aspx"&gt;Roadmap&lt;/A&gt; del programma.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Nel &lt;A href="http://www.mscui.net/PatientJourneyDemonstrator/" target=_blank mce_href="http://www.mscui.net/PatientJourneyDemonstrator/"&gt;Health Common User Interface (MSCUI) Patient Journey Demonstrator&lt;/A&gt;&amp;nbsp; vengono al momento implementate tre applicazioni che descrivono una tipica giornata di un paziente dal punto di vista della struttura ospedaliera che lo cura. Si va dalle interfacce finanziare fino alle informazioni sanitarie ed agli esami clinici.&amp;nbsp; Molte le funzionalità&amp;nbsp; di&amp;nbsp; Silverlight 2 Beta 1 utilizzate tra cui:&lt;/P&gt;
&lt;P&gt;· Deep zoom per la visualizzazione dei dati degli complex ECG (elettrocardiogrammi) &lt;/P&gt;
&lt;P&gt;· Scaling layout&lt;/P&gt;
&lt;P&gt;· Data-binding&lt;/P&gt;
&lt;P&gt;· Animazioni e integrazione di contenuti multimediali &lt;/P&gt;
&lt;P&gt;· Ampio utilizzo di grafica vettoriale per la rappresentazione di diagrammi&lt;/P&gt;
&lt;P&gt;Trovate anche&amp;nbsp;una &lt;A href="http://www.mscui.net/Showcase/Demonstrators.aspx" mce_href="http://www.mscui.net/Showcase/Demonstrators.aspx"&gt;introduzione allo scenario&lt;/A&gt; completa di video , descrizione delle applicazioni e scenari evolutivi futuri per le applicazioni di questo settore.&lt;/P&gt;
&lt;P&gt;Alcuni link per chi volesse cominciare a provare Silverlight 2 :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;- &lt;A href="http://silverlight.net/GetStarted/" mce_href="http://silverlight.net/GetStarted/"&gt;http://silverlight.net/GetStarted/&lt;/A&gt; dove trovate i link per installare il Runtime , le estensioni per Visual Studio 2008 e la versione di Expression Blend per SL2&lt;/P&gt;
&lt;P&gt;- &lt;A href="http://silverlight.net/learn/tutorials.aspx" mce_href="http://silverlight.net/learn/tutorials.aspx"&gt;http://silverlight.net/learn/tutorials.aspx&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tutorial sul Silverlight 2&lt;/P&gt;
&lt;P&gt;- &lt;A href="http://silverlight.net/learn/labs.aspx" mce_href="http://silverlight.net/learn/labs.aspx"&gt;http://silverlight.net/learn/labs.aspx&lt;/A&gt; .&amp;nbsp;&amp;nbsp;&amp;nbsp; laboratori sulle nuove funzionalità di Silverlight 2&lt;/P&gt;
&lt;P&gt;- &lt;A href="http://blogs.msdn.com/italy/archive/2008/04/24/the-next-web-now-le-slides.aspx" target=_blank mce_href="http://blogs.msdn.com/italy/archive/2008/04/24/the-next-web-now-le-slides.aspx"&gt;Slide dell'evento The Next Web Now&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;- &lt;A href="http://sessions.visitmix.com/" target=_blank mce_href="http://sessions.visitmix.com/"&gt;Sessioni&lt;/A&gt; di MIX 08&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Per chi fosse interessato alle funzionalità di accesso remoto a dati esposti da siti via http e web service, aspetto fondamentale per lo sviluppo di soluzioni applicative con SL suggerisco un &lt;A href="http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/18/accesso-ai-dati-con-siliverlight-2-beta-1.aspx" mce_href="http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/18/accesso-ai-dati-con-siliverlight-2-beta-1.aspx"&gt;mio post sull'argomento&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Ottimo &lt;A href="http://weblogs.asp.net/scottgu/archive/2008/02/22/first-look-at-silverlight-2.aspx" mce_href="http://weblogs.asp.net/scottgu/archive/2008/02/22/first-look-at-silverlight-2.aspx"&gt;tutorial introduttivo&lt;/A&gt; sul blog di Scott Guthrie.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/SilverlightelenuoveapplicazioniRIAServiz_83E0/clip_image001_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/SilverlightelenuoveapplicazioniRIAServiz_83E0/clip_image001_2.jpg"&gt;&lt;/A&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8470221" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Smart+Client/default.aspx">Smart Client</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Esempio di applicazione RIA con Silverlight :  Sanremoanchenoi da Rai Click e Kora</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/05/05/esempio-di-applicazione-ria-con-silverlight-sanremoanchenoi-da-rai-click-e-kora.aspx</link><pubDate>Mon, 05 May 2008 09:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8435734</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8435734.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8435734</wfw:commentRss><description>&lt;P&gt;L’evoluzione delle interfacce utente e l’emergere di applicazioni RIA (Rich Interactive Application) basate in gran parte sull’utilizzo di rich-plugin come Silverlight che arricchiscono il browser e potenziano le possibilità offerte dall’HTML e dalle tecniche AJAX sta rapidamente modificando la modalità con cui vengono sviluppate le applicazioni. Un ottimo esempio di come sia possibile combinare queste nuove potenzialità per sviluppare interfacce innovative è rappresentato dal sito sanremoanchenoi (&amp;nbsp;l'iniziativa è conlusa e qui potete vedere il &lt;A class="" href="http://roberto.design.members.winisp.net/sanremoanchenoi/sanremoanchenoi.html" target=_blank mce_href="http://roberto.design.members.winisp.net/sanremoanchenoi/sanremoanchenoi.html"&gt;video del&amp;nbsp;sito&lt;/A&gt;) . Si tratta di un iniziativa di &lt;A href="http://www.raiclick.it/" mce_href="http://www.raiclick.it/"&gt;Rai Click&lt;/A&gt;, implementata da &lt;A href="http://www.kora.it/" mce_href="http://www.kora.it/"&gt;Kora&lt;/A&gt; , avviata durante il festival di Sanremo e collegata proprio alla sperimentazione di nuove forme di user interface e di gestione di contenuti UGC (User Genereted Content) .&lt;/P&gt;
&lt;P&gt;L’iniziativa è basata su una serie di contest dove gli utenti possono inviare dei video per dimostrare le loro capacità “artistiche” collegate alla musica. Gli utilizzatori del sito possono navigare sui video, votarli ed inserire dei commenti. Di seguito un’immagine dell’interfaccia realizzata:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image002_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image002_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=438 alt=clip_image002 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image002_thumb.jpg" width=610 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image002_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Il sito rappresenta anche un ottimo esempio di utilizzo di software sviluppato localmente in combinazione con l’utilizzo di servizi offerti da piattaforme su Internet . Infatti, l’infrastruttura di gestione ed erogazione dei contenuti video è completamente basata su &lt;A href="http://silverlight.live.com/" mce_href="http://silverlight.live.com/"&gt;Silverlight Streaming&lt;/A&gt; che, attraverso la sua CDN (Content Delivery Network), fornisce il servizio di streaming per i filmati che vengono visualizzati nel client.&lt;/P&gt;
&lt;P&gt;L’interfaccia dell’intera applicazione è sviluppata con tecniche AJAX e sfrutta una logica sviluppata in Java Script per pilotare sia le componenti di grafica ed animazione sviluppate con Silverlight 1.0 , sia le componenti HTML. L’interazione con i servizi di back end che gestiscono il voting , i commenti ed il catalogo dei video è stata implementata in puro stile AJAX e l’iterfaccia client accede ai servizi attraverso XMLHttpRequest senza alcun reload dell’interfaccia client.&lt;/P&gt;
&lt;P&gt;L’applicazione ha poi una componente di back-end redazionale che gestisce l’approvazione dei contenuti e che in particolare gestisce l’encoding e l’upload dei video su Silverlight Streaming. L’encoding dei video viene realizzato con &lt;A href="http://www.microsoft.com/expression/products/overview.aspx?key=encoder" mce_href="http://www.microsoft.com/expression/products/overview.aspx?key=encoder"&gt;Expression Encoder&lt;/A&gt;. L’architettura di massima dell applicazione e la seguente:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image004_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image004_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=484 alt=clip_image004 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image004_thumb.jpg" width=615 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image004_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;La gestione della fruizione dei video dal client Silverlight avviene attraverso l’utilizzo combinato dei servizi locali al sito ed di Silverlight streaming . I video vengono pubblicati sul servizio , il catalogo locale del sito mantiene i riferimenti ai video . L’interfaccia caricata nel browser client interroga via http(utilizzando XMLHttpRequest via javascript) il servizio di catalogo che fornisce l’elenco dei video. L’elenco dei video viene caricato via Javascript nell’interfaccia Silverlight e mostrato all’utente.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image006_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image006_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=438 alt=clip_image006 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image006_thumb.jpg" width=609 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image006_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Nel momento in cui l’utente seleziona un video per effettuare lo streaming , l’applicazione client interroga attraverso degli script forniti da Silverlight Streaming che vengono inclusi nel client il servizio per ottenere l’url del video che viene poi visualizzato dal MediaElement di Silverlight, opportunamente utilizzato nell’interfaccia che provvede a consumare lo streaming fornito dalla CDN . &lt;/P&gt;
&lt;P&gt;Per chi volesse approfondire l’utilizzo di Silverlight Streaming service e la costruzione di siti UGC consiglio di utilizzare l’applicazione di esempio &lt;A href="http://www.codeplex.com/videoshow" mce_href="http://www.codeplex.com/videoshow"&gt;video.show&lt;/A&gt; che offre un esempio completo di codice sorgente scaricabile per realizzare siti UGC per il video sharing, con la possibilità di utilizzare Silverlight Streaming come meccanismo per la distribuzione dei video e l’SDK &lt;A href="http://dev.live.com/silverlight/" mce_href="http://dev.live.com/silverlight/"&gt;del servizio Silverlight Streaming&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Grazie alla flessibilità di Silverlight ed alla flessibilità dello XAML che consente di sviluppare una efficace collaborazione tra developer che sviluppa la logica dell’interfaccia e designer che implementa le componenti di grafica ed animazione, l’applicazione è stata sviluppata in tempi estremamente rapidi (2 settimane) . Anche per l’integrazione e la messa in produzione, la possibilità di sfruttare Silverlight Streaming come piattaforma di delivery dei video ha consentito di gestire l’intero progetto in tempi estremamente ridotti.&lt;/P&gt;
&lt;P&gt;La ricchezza di animazioni e contenuti multimediali dell’interfaccia utente mette in evidenza la notevole flessibilità che viene fornita da Silverlight. L’intera interfaccia contenuta nel browser è infatti realizzata con il plugin, combinando anche parte di contenuti in HTML che vengono utilizzati in overlay al contenuto implementato con Silverlight. Come si può vedere dalla seguente figura:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image008_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image008_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=433 alt=clip_image008 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image008_thumb.jpg" width=602 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image008_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;abbiamo una serie di oggetti grafici in overlay su un video di background, dove vengono composti i diversi menù, che interagiscono con l’utente attraverso delle animazioni che compongono le diverse scene previste in base alle selezioni effettuate dall’utente. &lt;/P&gt;
&lt;P&gt;Anche le liste dei contenuti video vengono posizionate in overlay al video di background e consentono di avere in preview il video selezionato in completo overlay sul video di background , componendo in un'unica interfaccia animazioni, grafica, testo e differenti flussi video:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image010_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image010_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=414 alt=clip_image010 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image010_thumb.jpg" width=576 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image010_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Le componenti dell’interfaccia che consento il voting e l’inserimento di commenti e contenuti sono sviluppate con dell’HTML che viene anche in questo caso posizionato in overlay ai contenuti realizzati in Silverlight ed anche in questo caso gestito con una logica in Java script che sfrutta le classiche tecniche AJAX per colloquiare con i servizi di back end che abbiamo descritto nell’architettura vista in precedenza. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image012_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image012_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=404 alt=clip_image012 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image012_thumb.jpg" width=577 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/EsempiodiapplicazioneRIAconSilverlightSa_10CA7/clip_image012_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Il sito resterà in produzione solo per alcune settimane collegate al contest collegato a sanremo.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8435734" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Live/default.aspx">Live</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Una giornata di Steve Ballmer</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/04/28/una-giornata-di-steve-ballmer.aspx</link><pubDate>Mon, 28 Apr 2008 16:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8435341</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8435341.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8435341</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN&gt;Durante la giornata che Steve Ballmer ha passato in italia la scorsa settimana Carlo Rossanigo lo ha seguito per tutto il tempo ed ha girato una video intervista con lui nei ritagli di tempo della giornata. Domande a tutto campo da su cosa pensa mentre&amp;nbsp; fa jogging, a come vive il social networking, da come si aspetta che sarà il web 3.0,&amp;nbsp;s cosa suggerisce ai giovani, .. insomma, 14 domande “unplugged” da non perdere !!!!&lt;/P&gt;&lt;/SPAN&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN&gt;Le trovate su &lt;A class="" href="http://www.mclips.it/archive/2008/04/26/one-day-with-steve-ballmer-14-domande-unplugged-a-steve-ballmer.aspx" mce_href="http://www.mclips.it/archive/2008/04/26/one-day-with-steve-ballmer-14-domande-unplugged-a-steve-ballmer.aspx"&gt;mclips&lt;/A&gt; .&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="COLOR: #1f497d"&gt;&lt;A href="http://www.mclips.it/archive/2008/04/26/one-day-with-steve-ballmer-14-domande-unplugged-a-steve-ballmer.aspx"&gt;&lt;SPAN style="COLOR: #1f497d"&gt;&lt;FONT face=Calibri size=3&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="COLOR: #1f497d"&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;SPAN style="COLOR: #1f497d"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8435341" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/OBA/default.aspx">OBA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Evento The Next Web Now: Slide sessione Costruire applicazioni RIA con Silverlight 2</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/04/24/evento-the-next-web-now-slide-sessione-costruire-applicazione-ria-con-silverlight-2.aspx</link><pubDate>Thu, 24 Apr 2008 15:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8421462</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8421462.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8421462</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://www.microsoft.com/italy/eventi/mix/default.mspx" mce_href="http://www.microsoft.com/italy/eventi/mix/default.mspx"&gt;&lt;IMG style="MARGIN: 0px 5px 0px 0px" height=86 alt=clip_image003 src="http://blogs.msdn.com/blogfiles/italy/WindowsLiveWriter/TheNextWebNowMIXEssentials23AprileaMilan_918B/clip_image003_3.jpg" width=282 align=left border=0 mce_src="http://blogs.msdn.com/blogfiles/italy/WindowsLiveWriter/TheNextWebNowMIXEssentials23AprileaMilan_918B/clip_image003_3.jpg"&gt;&lt;/A&gt;Ecco le &lt;A href="http://cid-d82de3153feb12ed.skydrive.live.com/self.aspx/Public/NextWeb/EventoWeb-Silverlight-w.zip" target=_blank mce_href="http://cid-d82de3153feb12ed.skydrive.live.com/self.aspx/Public/NextWeb/EventoWeb-Silverlight-w.zip"&gt;slide della mia sessione "Costruire applicazioni RIA con Silverlight 2"&lt;/A&gt; all'evento&amp;nbsp; &lt;A href="http://blogs.msdn.com/italy/archive/2008/04/09/the-next-web-now-mix-essentials-23-aprile-a-milano.aspx" target=_blank mce_href="http://blogs.msdn.com/italy/archive/2008/04/09/the-next-web-now-mix-essentials-23-aprile-a-milano.aspx"&gt;The Next Web Now – MIX Essentials&lt;/A&gt; . Sul blog di &lt;A class="" href="http://blogs.msdn.com/italy/archive/2008/04/24/the-next-web-now-le-slides.aspx" target=_blank mce_href="http://blogs.msdn.com/italy/archive/2008/04/24/the-next-web-now-le-slides.aspx"&gt;MSDN Italia&lt;/A&gt; i link alle altre slide e presto anche i filmati delle sessioni. Grazie a tutti per la partecipazione.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8421462" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/REST/default.aspx">REST</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Accesso ai dati con Siliverlight 2 Beta 1</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/18/accesso-ai-dati-con-siliverlight-2-beta-1.aspx</link><pubDate>Tue, 18 Mar 2008 11:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8272689</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8272689.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8272689</wfw:commentRss><description>&lt;P&gt;In questo fine settimana ho passato un po di tempo libero ad approfondire i bit disponibili della &lt;A href="http://silverlight.net/GetStarted/#betajump" target=_blank mce_href="http://silverlight.net/GetStarted/#betajump"&gt;Beta 1 di Silverligth 2&lt;/A&gt; . Tra le tantissime novità offerte dal supporto del codice managed,&amp;nbsp; la nuova versione mette a disposizione un'ampia parte delle librerie .NET tra cui nuovi meccanismi per accedere a dati esposti da siti Internet\Intranet via HTTP.&lt;/P&gt;
&lt;P&gt;Sia Internet che nelle intranet è sempre più frequente l'utilizzo dell'HTTP per l'esposizione di informazioni attraverso diverse forme (Web Service Soap,RSS, REST, POX, JSON, etc). &lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_6.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=375 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_2.png" width=450 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Lo scenario tipico di sviluppo Web che prevedeva lo strato di accesso ai dati realizzato direttamente dalla parte server dell'applicazione Web ,&amp;nbsp; sta rapidamente evolvendo. Anche le&amp;nbsp; applicazioni&amp;nbsp; basate sul browser sono sempre più caratterizzate da una larga presenza di codice client, che sfrutta tecniche AJAX&amp;nbsp;&amp;nbsp; per consumare dati offerti da servizi esposti da server. In particolare diventano sempre più frequenti gli scenari in cui si utilizzano fonti dati esposte da siti differenti, che vengono combinate in un unica interfaccia direttamente sul client. &lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_2.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=449 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb.png" width=531 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Questo tipo di scenario non riguarda esclusivamente le applicazioni sviluppate per Internet ma diventa sempre più presente anche in scenari Intranet. Con sempre maggior frequenza le aziende cominciano a &lt;A href="http://blogs.msdn.com/giuseppeguerrasio/archive/2007/12/11/la-fine-della-tirannia-dell-or-software-services-s-s.aspx" target=_blank mce_href="http://blogs.msdn.com/giuseppeguerrasio/archive/2007/12/11/la-fine-della-tirannia-dell-or-software-services-s-s.aspx"&gt;combinare il software interno con servizi esterni&lt;/A&gt;. Le applicazioni e le &lt;A href="http://blogs.msdn.com/giuseppeguerrasio/archive/2007/12/12/saas-soa-e-s-s-impatto-per-le-aziende.aspx" target=_blank mce_href="http://blogs.msdn.com/giuseppeguerrasio/archive/2007/12/12/saas-soa-e-s-s-impatto-per-le-aziende.aspx"&gt;informazioni aziendali vengono utilizzate in combinazione&amp;nbsp; con servizi presenti su Internet e con le applicazioni delle aziende clienti o partner&lt;/A&gt;, creando scenari un cui la gestione dell'accesso ai dati da parte del codice che gira nel browser client, diventa sempre più sofisticata e complessa. Ad esempio, un azienda che ha bisogno di un software per la gestione di spedizioni presso i propri punti vendita potrebbe sviluppare un applicazione client che aggrega le informazioni sui punti vendita estratte da servizi presenti nella intranet , posizionando i punti vendita sulle mappe fornite da un provider di mappe su Internet ed i servizi del corriere utilizzato per effettuare le spedizioni, integrando con i dati aziendali&amp;nbsp; i servizi per gli ordini, lo stato della spedizione , etc.&lt;/P&gt;
&lt;P&gt;Evidentemente in scenari più complessi di integrazione non tutta l'aggregazione dei servizi può essere implementata nel client , perchè in moltissimi casi il coordinamento dei servizi stessi comporta la gestione di processi asincroni che vanno gestiti con specific Business Process Manager , ma sono comunque molti gli scenari in cui ha senso aggregare nel client. Nel nostro scenario un esempio ll'invio di un ordine di spedizione verrà sicuramente gestito attraverso il BPM dell'azienda che provvederà poi ad inviare l'ordine al servizio del corriere mentre lo stato della singola spedizione&amp;nbsp; potrebbe direttamente essere richiesto dal client al servizio del corriere e combinato direttamente sulla mappa e con gli altri dati provenienti dall'Intranet.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_10.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=509 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_4.png" width=783 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_4.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Altra interessante modalità di integrazione dei servizi con i processi dell'azienda è rappresentata dalla possibilità di sfruttare office ed il pattern OBA per collegare un scenario di questo tipo , direttamente con gli strumenti di produttività che le persono utilizzano per portare avanti i processi di tutti i giorni, ed una blla implementazione reale di uno scenario simile è rappresentata daei servizi che sta implementando FedEx &lt;A href="http://blogs.msdn.com/giuseppeguerrasio/archive/2008/02/12/servizi-online-e-office-un-esempio-dal-mondo-reale.aspx" target=_blank mce_href="http://blogs.msdn.com/giuseppeguerrasio/archive/2008/02/12/servizi-online-e-office-un-esempio-dal-mondo-reale.aspx"&gt;mostrati alla office developers conference&lt;/A&gt;&amp;nbsp; .&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_12.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=517 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_5.png" width=812 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_5.png"&gt;&lt;/A&gt;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Con la prima versione di Silverlight gestire l'accesso a fonti dati è possibile direttamente dallo XAML per immagini, video , suoni mentre per l'accesso a sorgenti dati&amp;nbsp; occorre utilizzare il JS e l'oggetto XmlHttpRequest . Attraverso queste modalità e gia possibile sviluppare delle interessanti applicazioni di mashup (esempio interessante sviluppato in Italia sul blog msdn) , ma ovviamente sviluppare completamente utilizzando JS XMLHttprequest con sorgenti dati JSON o XML non è semplice e nemmeno particolarmente performante nella parte di parsing e caricamento dei dati sull'interfaccia utente. &lt;/P&gt;
&lt;P&gt;In alcuni casi, per eliminare il costo del parsing sul client, è anche possibile fare in modo di costruire dei servizi in grado di rispondere direttamente con delle porzioni di XAML che vengono valorizzate server side, con i dati estratti da sorgenti specifiche e caricati a partire da template disponibili sul server. Lato client si può utilizzare XMLHttpRequest o il downloader di Silverlight per connettrsi all'url sul server che restituisce lo XAML contenente i dati e caricarlo nell'interfaccia utilizzando CreateFromXaml . &lt;A href="http://silverlight.net/learn/learnvideo.aspx?video=113" target=_blank mce_href="http://silverlight.net/learn/learnvideo.aspx?video=113"&gt;Questo Howto&lt;/A&gt; mostra un semplice esempio di utilizzo di questa tecnica che sfutta lo XAML mentre &lt;A href="http://silverlight.net/learn/learnvideo.aspx?video=242" target=_blank mce_href="http://silverlight.net/learn/learnvideo.aspx?video=242"&gt;questo&lt;/A&gt; mostra l'utilizzo di web service da Silverligh 1.0&amp;nbsp; .&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_14.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=455 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_6.png" width=704 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_6.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;L'utilizzo di AJAX e quindi dello JavaScript e di XMLHttpRequest per accedere a fonti dati remote comporta una notevole difficoltà di debug ed è sottoposto alle restrizioni imposte dal browser per il cross-scripting . Infatti attraverso questa tecnica possono essere interrogati solo URL residenti sullo stesso dominio da cui è stata caricata la pagina in esecuzione sul Browser. E' possibile attraverso specifiche tecniche di impiego di script dinamici o proxy lato server, Iframe etc, superare una parte di queste limitazioni , ma il risultato incrementa ancora di più la complessità di sviluppo e debug.&lt;/P&gt;
&lt;P&gt;Con l'arrivo di Silverlight 2 (SL2) ed il supporto di .NET nello sviluppo con Silverlight abbiamo a disposizione un' ampia serie di classi che andranno ulteriormente ad arricchisi nella versione finale del nuovo plug-in. Attraverso SL2 abbiamo a disposizione le classi per consumare sia Web Service SOAP che per accedere direttamente a URL in GET e POST che per l'utilizzo di RSS , aggiunte anche le classi per gestire socket in uscita. Attraverso il nuovo modello di sviluppo è possibile anche effettuate cross-scripting attraverso quei siti che impostano sulla root del loro dominio il file di policy per questa funzionalità. Viene supportato anche il file di policy di Flash , per cui su tutti i siti in cui è già presente questo file è possibile fare crossscripting con Silverlight. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_19.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_19.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=507 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_8.png" width=687 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_8.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Oltre al supporto per il cross-scripting, il nuovo modello di controlli di SL2 supporta le funzionalità di databinding con le stesse modalità che sono utilizzate nel .NET Framework e Windows Presentation foundation , rendendo di fatto estremamente semplice anche il caricamento dei dati estratti dai servizi&amp;nbsp; sui controlli dell'interfaccia utente. Disponibile anche il supporto per LINQ to XML che ci permette di gestire con semplicità la manipolazione delle strutture XML estratte dai servizi.&lt;/P&gt;
&lt;P&gt;Facciamo un esempio pratico provando a sviluppare un client per video.msn.com ed in particolare per estrarre un elenco di video casuale e visualizzare le informazioni fornite in formato XML dall'URL: &lt;A href="http://catalog.video.msn.com/randomVideo.aspx?mk=us&amp;amp;vs=0&amp;amp;ff=99&amp;amp;c=10&amp;amp;random=12345" target=_blank mce_href="http://catalog.video.msn.com/randomVideo.aspx?mk=us&amp;amp;vs=0&amp;amp;ff=99&amp;amp;c=10&amp;amp;random=12345"&gt;http://catalog.video.msn.com/randomVideo.aspx?mk=us&amp;amp;vs=0&amp;amp;ff=99&amp;amp;c=10&amp;amp;random=12345&lt;/A&gt;&amp;nbsp;&amp;nbsp; . Di seguito l'XML che viene restituito dal servizio di MSN:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_7.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_7.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=567 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_1.png" width=938 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;La piccola applicazione che realizzeremo avrà quindi la seguente struttura:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_21.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_21.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=481 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_9.png" width=602 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_9.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;In particolare per accedere alle informazioni utilizzeremo la classe System.Net.WebClient messa a disposizione dalla versione di .NET associata a SL2 che consente di accedere ad URL Internet in GET e POST a patto di contattare un URL sullo stesso dominio da cui abbiamo scaricato l'applicazione o su un dominio che ha posizionato sulla sua root un file di policy per il cross-scripting Silverlight o Flash. Infatti su catalog.msn.video.com troviamo il file clientaccesspolicy.xml : &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_15.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_15.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=312 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_3.png" width=520 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Per costruire il nostro client SL2 utiliziamo Visual Studio 2008 selezionando lo specifico template di progetto per Silverlight scegliendo di farci generare anche il progetto Web per il test dell'applicazione:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_17.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_17.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=520 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_7.png" width=813 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_7.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=center&gt;&amp;nbsp;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_25.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_25.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=499 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_11.png" width=825 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_11.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Ottenendo così una soluzione con due progetti: uno per l'implementazione dell'applicazione SL2, l'altro per l'applicazione Web:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_27.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_27.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=366 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_12.png" width=303 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_12.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;SL2 supporta oltre al Canvas due nuovi controlli di Layout , ovvero i contenitori per il posizionamento dei controlli sulla nostra interfaccia. Per il nostro esempio utiliziamo una Grid, equivalente a quella che abbiamo nel fratello maggiore WPF, con due righe all'interno delle quali inseriremo gli elementi fondamentali dell'intrfaccia: nella prima riga i controlli per impostare i parametri della ricerca sul contenuto dei risultati, nella seconda il contenuto selezionato in base ad i parametri di ricerca impostati. Per poter inserire , impostiamo ,inoltre, la proprietà ShowGridLines a true per visualizza la struttura della griglia: &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_29.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_29.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=594 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_13.png" width=918 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_13.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_31.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_31.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=758 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_14.png" width=882 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_14.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Sull'handler dell'evento click del controllo Button inserito per effetuare la ricerca:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_23.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_23.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=115 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_10.png" width=887 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_10.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;inseriamo il codice che utilizzando la classe WebClient&amp;nbsp; ci permetterà di accedere ai dati di cataalogo. La classe WebClient mette a disposizione i metodi per accedere ed estrarre informazioni da un URL solo attraverso un pattern asincrono. Per accedere al catalogo di MSN video ed estrarre le informazioni in XML utilizzaremo il seguente codice:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_35.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_35.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=324 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_16.png" width=793 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_16.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_37.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_37.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=645 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_17.png" width=713 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_17.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Le informazioni in XML ottenute dal servizio possono essere direttamente caricate in u Array utilizzando Linq To Xml . Per utilizzare questa funzionalità occorre referenziare lo specifico assembly System.Linq.Xml :&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_41.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_41.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=519 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_19.png" width=877 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_19.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Dove ns è una proprietà per gestire in namespace contenuto nel file XML, GetUriAsset un metodo helper per estrarre idati e VideoSource una specifica classe inserita nel progetto per rappresentare le informazioni dei video:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_43.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_43.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=378 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_20.png" width=950 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_20.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Ottenuto l'array con le informazioni , possiamo sfruttare il databinding e collegare direttamente la collezione contenente i dati da visualizzare ad uno dei nuovi controlli offerti da SL2 completi di supporto per il databindig. Per questo semplice esempio utilizzeremo direttamente il nuovo controllo DataGrid che aggiungeremo allo XAML:&lt;/P&gt;
&lt;P align=left&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_51.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_51.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=494 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_24.png" width=847 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_24.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;e poi lo collegheremo ai dati usando la proprietà ItemSource:&lt;/P&gt;
&lt;P align=left&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_53.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_53.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=333 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_25.png" width=898 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_25.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Ottenendo a runtime il seguente risultato:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_47.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_47.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=520 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_22.png" width=924 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_22.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Come tutto il modello dei controlli di SL2 in maniera speculare a quanto possibile in WPF è possibile definire dei template di visualizzazione per i controlli. Infatti , ad esempio, nella colonna contenente l'url dell'immagine di preview possiamo impostare un template per fare visualizzare l'immagine al posto dell'url nella specifica colonna utilizzando la funzionalità di databinding per collegare i dati ad i controlli inseriti nel template. &lt;/P&gt;
&lt;P align=left&gt;Nel nostro esempio, in particolare, andiamo ad usare il template della RowDetails ovvero la riga di dettaglio che viene supportata dal DataGrid per ogli riga inserita. Impostiamo un template sulla riga di dettaglio per permettere la visualizzazione dell'immagine di preview del video. Il campoSource del controllo immagine lo colleghiamo al campo ImageUrl del datacontext con la specifica funzionalità di databinding ( {Binding ImageUrl} ) corrente e&amp;nbsp; impostiamo anche la specifica proprietà della DataGrid che ci permette di mostrare la RowDetails nel momento in cui la riga viene selezionata:&lt;/P&gt;
&lt;P align=left&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_57.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_57.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=252 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_27.png" width=984 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_27.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Il risultato ottenuto a runtime sarà il seguente:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_55.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_55.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=426 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_26.png" width=956 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_26.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Oltre al campo Image, possiamo anche direttamente inserire un MediaElement e riprodurre il direttamente il video.&lt;/P&gt;
&lt;P align=left&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_61.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_61.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=186 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_29.png" width=971 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_29.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_59.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_59.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=405 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_28.png" width=884 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_28.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Agendo con altri template è possibile personalizzare completamente la griglia così come qualunque altro controllo adattandola come vogliamo alle nostre esigenze grafiche.&lt;/P&gt;
&lt;P align=left&gt;Come abbiamo già detto l'oggetto WebClient è solo uno dei meccanismi offerti da SL2 per l'accesso ai dati. Per l'accesso a servizi SOAP silverlight mette a disposizione lo stack client di WCF permettendo l'utilizzo del classico modello "Add Service Reference" che consente di generare da Visual Studio una classe proxy a partire dai metadati del WSDL esposto dal servizio, classe che poi può essere usata direttamente per l'accesso a servizio. Anche in questo caso il proxy genera solo la possibilità di utilizzare con un pattern asincrono le chiamate al servizio, per evitare di bloccare l'interfaccia utente. Di seguito uno schema dello stack WCF per SL2.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_67.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_67.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=345 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_32.png" width=460 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_32.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Facciamo anche un piccolo progetto di test per l'utilizzo di Web Services da SL2 utilizzando WCF come servizio server. Sviluppiamo un semplice client SL2 per estrarre le informazioni dei clienti del classico database Northwind esposto attraverso un servizio WCF. Partiamo con un nuovo progetto Silverlight e selezioniamo anche la costruzione dell'applicazione Web di test.&amp;nbsp; &lt;/P&gt;
&lt;P align=left&gt;All'interno dell'applicazione web di test aggiungiamo un modello LINQ To Sql&amp;nbsp; per accedere alla tabella Customers del database Northwind :&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_39.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=318 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_18.png" width=541 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Con il wizard di LINQ To Sql selezioniamo la tabella Customers e ci facciamo generare il modello di classi per l'accesso ai dati dal nostro ORM:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_45.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=332 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_21.png" width=433 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Impostiamo la specifica proprietà che ci consente di rendere serializzabili le classi generate da Linq To Sql:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_49.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=310 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_23.png" width=488 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Aggiungiamo un servizio di tipo WCF al nostro progetto:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_33.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=326 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_15.png" width=567 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Dove implementiamo la seguente interfaccia per estrarre l'elenco dei clienti dal database customers che sono in una specifica città:&lt;/P&gt;
&lt;P align=left&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_69.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=275 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_33.png" width=696 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Implementiamo l'interfaccia sul servizio ed impostiamo con LINQ la query per estrarre i clienti in base al parametro selezionato:&lt;/P&gt;
&lt;P align=left&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_71.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=414 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_34.png" width=637 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Come ultimo step per permettere l'accesso a SL2 al servizio, impostiamo come profilo di banding il basicProfile , agendo sul file di configurazione della nostra applicazione client per fare in modo che l'implementazione SOAP del servizio sia compatibile con il Basic Profile SOAP che viene supportato da SL2:&lt;/P&gt;
&lt;P align=left&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_75.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=228 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_36.png" width=731 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Lato SL2 implementiamo una semplice interfaccia per l'invio della richiesta al servizio e la visualizzazione della risposta:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_73.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=450 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_35.png" width=867 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Per poter agganciare il servizio, dal progetto SL2 usiamo la classica add service reference, selezionando il servizio WCF :&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_77.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=506 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_37.png" width=881 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;L'ambiente di sviluppo carica il WSDL esposto dal servizio e ci implementa il proxy necessario per l'accesso al servizio e la configurazione di WCF:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_79.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=152 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_38.png" width=225 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Sull'evento di click del Button query inserito nell'interfaccia SL implementiamo il codice per accedere al servizio , e sul metodo di callback agganciamo non il databinding la DataGrid ai dati estratti dal servizio:&lt;/P&gt;
&lt;P align=left&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_81.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=430 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_39.png" width=995 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Completando il nostro esempio:&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_83.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=609 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_40.png" width=716 border=0&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Per approfondire questo aspetto vi consiglio :&amp;nbsp; &lt;A title=http://msdn2.microsoft.com/en-us/library/cc296254(VS.95).aspx href="http://msdn2.microsoft.com/en-us/library/cc296254(VS.95).aspx" target=_blank mce_href="http://msdn2.microsoft.com/en-us/library/cc296254(VS.95).aspx"&gt;http://msdn2.microsoft.com/en-us/library/cc296254(VS.95).aspx&lt;/A&gt; .&amp;nbsp; &lt;/P&gt;
&lt;P align=left&gt;In SL2 avremo a disposizione anche i serializzatori JSON . Al link&amp;nbsp; &lt;A href="http://code.msdn.microsoft.com/SilverlightWS" target=_blank mce_href="http://code.msdn.microsoft.com/SilverlightWS"&gt;http://code.msdn.microsoft.com/SilverlightWS&lt;/A&gt;&amp;nbsp;&amp;nbsp; trovate alcuni esempi del supporto JSON su cui il team di sviluppo sta lavorando :&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_65.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_65.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=315 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_31.png" width=536 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_31.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Interessante anche la funzionalità prevista per l'ambiente di sviluppo paste as XmlSerializable che ci consentirà da VisualStudio di fare copia e incolla di un frammento XML per generare direttamente una classe tipizzata per rappresentare lo stesso XML con una classe .NET, cosa che in parte è possibile con il tool da riga di comando XSD.EXE di .NET.&lt;/P&gt;
&lt;P align=center&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_63.png" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_63.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=349 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_30.png" width=552 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/AccessoaidaiconSiliverlight2Beta1_71B1/image_thumb_30.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P align=left&gt;Disponibile anche il supporto per i socket, ma solo verso il dominio da cui è stata scaricata l'applicazione (no crossscripting al momento) ed il supporto per Syndication che è praticamente identico a quello disponibile in .NET 3.5. &lt;/P&gt;
&lt;P&gt;Per chi volesse cominciare a provare Silverlight 2 suggerisco i seguenti link:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;- &lt;A href="http://silverlight.net/GetStarted/#betajump"&gt;http://silverlight.net/GetStarted/#betajump&lt;/A&gt; dove trovate i link per installare il Runtime , le estensioni per Visual Studio 2008 e la versione di Expression Blend per SL2&lt;/P&gt;
&lt;P&gt;- &lt;A href="http://silverlight.net/learn/tutorials.aspx"&gt;http://silverlight.net/learn/tutorials.aspx&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tutorial sul Silverlight 2&lt;/P&gt;
&lt;P&gt;- &lt;A href="http://silverlight.net/learn/labs.aspx"&gt;http://silverlight.net/learn/labs.aspx&lt;/A&gt; .&amp;nbsp;&amp;nbsp;&amp;nbsp; laboratori sulle nuove funzionalità di Silverlight 2&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P align=left mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P align=left&gt;Al link &lt;A title=http://silverlight.net/Quickstarts/Remote/default.aspx href="http://silverlight.net/Quickstarts/Remote/default.aspx" target=_blank mce_href="http://silverlight.net/Quickstarts/Remote/default.aspx"&gt;http://silverlight.net/Quickstarts/Remote/default.aspx&lt;/A&gt; trovate un quickstart sugli argomenti trattati.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8272689" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Data+Access/default.aspx">Data Access</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/REST/default.aspx">REST</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Silverlight e le nuove interfacce per i Servizi Finanziari</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/16/silverlight-e-le-nuove-interfacce-per-i-servizi-finanziari.aspx</link><pubDate>Sun, 16 Mar 2008 14:21:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8240134</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8240134.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8240134</wfw:commentRss><description>&lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="179" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/SilverlightelenuoveinterfacceperiServizi_A3DA/image_3.png" width="240" align="left" border="0" /&gt; Normalmente si &amp;#232; portati a pensare che la costruzione di interfacce innovative e ricche di contenuti, sia una tematica riservata al mondo dell'intrattenimento . In realta la possibilit&amp;#224; di sfruttare le potenzialit&amp;#224; delle nuove tecnologie per lo sviluppo di interfacce RIA (Rich Interactive Application) pu&amp;#242; essere effettuato a vantaggio di qualunque tipologia di applicazione, permettendo di costruire siti che consentono di aprire scenari completamente nuovi, contribuendo a migliorare significativamente anche servizi come la Banca Online. Un bell'esempio di quello che &amp;#232; possibile fare in questo settore &amp;#232; rappresentato dalla applicazione demo mostrata alcuni giorni f&amp;#224; alla &lt;a href="http://www.financialdevelopers.com/"&gt;Financial Services Developers Conference&lt;/a&gt; in NY. &lt;/p&gt;  &lt;p&gt;Si tratta di una demo che illustra un 'mock-up' di esempio di un sito finanziario sviluppato in Silverlight 2 che potete vedere online in &lt;a href="http://www.cookingwithxaml.com/meals/financials/default.html" target="_blank"&gt;questo sito&lt;/a&gt; . Caratteristiche interessanti di Silverlight 2 vengono combinate insieme all'interno di questo esempio, video e grafici interattivi, drag&amp;amp;drop , codice client compilato per calcoli , utilizzo di web service,&amp;#160; dimostrando le potenzialit&amp;#224; anche in questo tipo di scenari.&lt;/p&gt;  &lt;p&gt;Un video di introduzione alla demo lo trovate su questo &lt;a title="silverlight streaming video" href="http://silverlight.services.live.com/invoke/40230/findemo/iframe.html" target="_blank"&gt;silverlight streaming video&lt;/a&gt;&amp;#160; e a quest'altro link trovate un &lt;a href="http://www.cookingwithxaml.com/meals/financials/docs/SilverlightFinancialDemonstratorScript.docx" target="_blank"&gt;documento&lt;/a&gt; che descrive gli step dello scenario demo.&lt;/p&gt;  &lt;p&gt; Il codice sorgente dell'esempio lo potete scaricare &lt;a href="http://www.cookingwithxaml.com/meals/financials/source/SilverlightinFinancialsSource.zip" target="_blank"&gt;qui&lt;/a&gt;, al momento &amp;#232; un porting dalla versione 1.1 di Silverlight&amp;#160; e&amp;#160; verr&amp;#224; a breve pubblicata una nuova versione che sar&amp;#224; anche inserita nella gallery su Silverlight.net . Link al &lt;a href="http://blogs.msdn.com/jaimer/archive/2008/03/13/silverlight-in-financials-demonstrator.aspx" target="_blank"&gt;blog di Jaime Roudriguez&lt;/a&gt; che ha pubblicato la notizia .&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8240134" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/SaaS/default.aspx">SaaS</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Silverlight Blueprint per SharePoint</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/04/silverlight-blueprint-per-sharepoint.aspx</link><pubDate>Tue, 04 Mar 2008 18:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8023573</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8023573.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8023573</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/sharepoint/cc303301.aspx" target=_blank mce_href="http://msdn2.microsoft.com/en-us/sharepoint/cc303301.aspx"&gt;&lt;IMG height=137 alt=sl src="http://blogs.tamtam.nl/mart/content/binary/SilverlightBlueprintforSharePoint_7EC0/sl_thumb.png" width=244 align=left border=0 mce_src="http://blogs.tamtam.nl/mart/content/binary/SilverlightBlueprintforSharePoint_7EC0/sl_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Come posso integrare Silverlight all'interno del mio portale basato su Sharepoint ? Domanda classica e ricorrente da tempo in tutti gli incontri con clienti e partner che hanno come argomento una delle due tecnologie. Ora disponibile il &lt;A href="http://blogs.tamtam.nl/mart/ct.ashx?id=09f0b223-9169-40e6-9b39-4675590fc180&amp;amp;url=http%3a%2f%2fwww.ssblueprints.net%2fsharepoint%2f" mce_href="http://blogs.tamtam.nl/mart/ct.ashx?id=09f0b223-9169-40e6-9b39-4675590fc180&amp;amp;url=http%3a%2f%2fwww.ssblueprints.net%2fsharepoint%2f"&gt;Silverlight Blueprint per SharePoint web site&lt;/A&gt;&amp;nbsp; completo di esempi con tutorial e video&amp;nbsp; che mostrano come integrare Silverlight all'interno di applicazioni basate su Sharepoint. &lt;/P&gt;
&lt;P&gt;Sei applicazioni di esempio verranno rese disponibili per partire a sviluppare siti combinando le potenzialità delle due tecnologie tra cui un Navigation Control, un viewer per i colleghi&amp;nbsp; che effettua delle lookup in Active Directory usando WCF, una SharePoint picture library basata su Silverlight, un custom field type per slider control e molto altro.&lt;/P&gt;
&lt;P&gt;Disponibile anche un assembly wrapper di base per che include delle wrapper class di partenza per includere Silverlight in WebPart .&amp;nbsp; Il Blueprint conterrà il codice sorgente di esempi e wrapper rilasciato con la modalità&amp;nbsp; shared source su codeplex.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8023573" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Office/default.aspx">Office</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/OBA/default.aspx">OBA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Sharepoint/default.aspx">Sharepoint</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>ADO.NET Data Service</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/04/ado-net-data-service.aspx</link><pubDate>Tue, 04 Mar 2008 12:00:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8021678</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8021678.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8021678</wfw:commentRss><description>&lt;p&gt;Un'altra interessante componente disponibile con la &lt;a href="http://asp.net/downloads/3.5-extensions/" target="_blank"&gt;CTP delle ASP.NET 3.5 Extension&lt;/a&gt; è la nuova infrastruttura per lo sviluppo di Web Data Service ADO.NET Data Service. Si tratta dell'evoluzione in prodotto della &lt;a href="http://blogs.msdn.com/giuseppeguerrasio/archive/2007/05/14/accesso-al-database-attraverso-un-url-code-name-astoria.aspx" target="_blank"&gt;tecnologia incubazione denominata "Astoria" mostrata a MIX 07&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Il nuovo framework ha lo scopo di semplificare l'erogazione di sorgenti dati sul Web venendo incontro alla trasformazione che i siti internet stanno avendo nell'utilizzo di queste funzionalità. &lt;/p&gt; &lt;p&gt;I siti Web da semplici erogatori di interfacce HTML si stanno trasformando in erogatori di dati.&amp;nbsp; Con lo sviluppo di AJAX e delle applicazioni RIA si sta&amp;nbsp; passando da un approccio in cui dall'esecuzione del codice lato server si accedeva alle sorgenti dati utilizzate nei siti&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="222" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb.png" width="488" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;ad un approccio in cui dal codice client che si esegue nel browser, si accede direttamente alle sorgenti dati via HTTP, genericamente attraverso un approccio REST&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="197" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_1.png" width="498" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Il framework ADO.NET Data Service è uno strato costruito sopra l'Entity Framework che permette di rendere accessibile attraverso un URL con uno stile REST il modello E/R implementato (per approfondimenti sull'entity framework vi consiglio : &lt;a title="http://msdn2.microsoft.com/en-us/library/aa697427(VS.80).aspx" href="http://msdn2.microsoft.com/en-us/library/aa697427(VS.80).aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa697427(VS.80).aspx&lt;/a&gt;&amp;nbsp; e &lt;a title="http://msdn2.microsoft.com/en-us/library/cc161164(printer).aspx" href="http://msdn2.microsoft.com/en-us/library/cc161164(printer).aspx"&gt;http://msdn2.microsoft.com/en-us/library/cc161164(printer).aspx&lt;/a&gt;&amp;nbsp; ). In realtà non permette esclusivamente di esporre modelli dell'Entity framework ma di qualunque entità che implementi l'interfaccia IQueryable &amp;lt;T&amp;gt; .&lt;/p&gt; &lt;p&gt;Oltre a fornire le componenti server per esporre via Http con stile REST il modello di entità, il framework offre due nuove API client per semplificare l'accesso ai dati esposti in questa modalità:&lt;/p&gt; &lt;p&gt;- Un libreria JavaScript che estende i namespace della Microsoft Ajax Library (namespace Sys.Data ed in particolare Sys.Data.DataService nella Script Library&amp;nbsp; MicrosoftAjaxDataService.js)&lt;/p&gt; &lt;p&gt;- una libreria .NET pensata per client sia silverlight che .NET Framework per desktop ( namespace Microsoft.Data.WebClient contenuto nelle Extension con particolare riferimento alle classi WebDataContext e WebDataQuery ).&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Per poter analizzare più nel dettaglio il funzionamento del framework partiamo con l'implementare un semplice esempio basandoci sull'Entity Framework. In particolare partiremo con il creare un entity data model sul classico database Northwind per poi esporre con un servizio ADO.NET DataService le entità via http e poi accederci utilizzandole due librerie client citate.&lt;/p&gt; &lt;p&gt;I passi da implementare sono essenzilmente i seguenti:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;- Creare il Progetto&lt;/p&gt; &lt;p&gt;- Creare l'Entity Model&lt;/p&gt; &lt;p&gt;- Creare il Data Service e Autorizzare gli accessi&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Procediamo con la creazione di un nuovo Web Site. Dopo aver avviato il progetto, includiamo un elemento di tipo ADO.NET Entity Data Model lo connettiamo al classico database Nortwind , ottenendo un nuovo modello che utilizzeremo come base per l'esposizione del servizio di accesso ai dati.&lt;/p&gt; &lt;p align="center"&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="391" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_2.png" width="574" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p align="center"&gt;&amp;nbsp; &lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_8.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="387" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_3.png" width="567" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p align="center"&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_10.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="392" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_4.png" width="566" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Aggiungiamo ora un elemento di tipo ASP.NET Data Service e lo colleghiamo al modello EDM appena creato&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_12.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="397" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_5.png" width="576" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;ottenendo un servizio come quello che vediamo di seguito:&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_14.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="342" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_6.png" width="575" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Si tratta di un servizio che utilizza WCF ed il nuovo supporto REST offerto da .NET 3.5 e attraverso una infrastruttura costruita sopra queste funzionalità basata sulla classe WebDataService, espone il nostro EDM che in questo caso è basata data context NorthwindEntities che abbiamo appena costruito con il tool dell'entity framework e che stiamo indicando con lo specifico generics previsto dalla classe:&lt;/p&gt; &lt;p&gt;.........&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;public class Northwind: WebDtataService &amp;lt;NorthwindModel.NorthwindEntities&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;........&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;In realtà la classe WebDataService come abbiamo già detto è in grado di gestire qualunque modello che implementi l'interfaccia IQueryable &amp;lt;T&amp;gt;.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Per autorizzare l'accesso alle informazioni esposte dal servizio utiliziamo la classe di autorizzazione appositamente inserita nel servizio , aggiungendo al configurazione sul costruttore del servizio per ottenere l'accesso ai dati di tutti i clienti contenuti nel database nortwind su cui abbiamo costruito il nostro EDM.&lt;/p&gt; &lt;p&gt;Nel nostro piccolo esempio impostiamo l'accesso completo a tutte le risorse presenti nel modello esposto attraverso il servizio:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;namespace SimpleDataService { &lt;/p&gt; &lt;p&gt;&amp;nbsp; public class Northwind : WebDataService&amp;lt;NorthwindEntities&amp;gt; { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void InitializeService(IWebDataServiceConfiguration config) { &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; config.SetResourceContainerAccessRule("*", ResourceContainerRights.All); &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;/p&gt; &lt;p&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; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Per poter effettuare un test sul funzionamento del servizio è possibile inviare direttamente con un browser una richiesta GET del tipo seguente:&lt;/p&gt; &lt;p&gt; http://localhost:2759/WebSite1/Northwind.svc/Customers&lt;/p&gt; &lt;p&gt; con la quale otteniamo accesso ai dati di tutti i clienti. Oppure la seguente con cui otteniamo l'accesso ad uno specifico customer:&lt;/p&gt; &lt;p&gt;http://localhost:2759/WebSite1/Northwind.svc/Customers('alfki')&lt;/p&gt; &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_16.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="400" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ASP.NETDataService_D85B/image_thumb_7.png" width="554" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;o ad esempio ai suoi ordini:&lt;/p&gt; &lt;p&gt;http://localhost:2759/WebSite1/Northwind.svc/Customers('alfki')/Orders&lt;/p&gt; &lt;p&gt;Per un introduzione sulla sintassi per ADO.NET DataService potete far riferimento a &lt;a title="http://quickstarts.asp.net/3-5-extensions/adonetdataservice/SimpleAddressingSchemeForDataWithUniformURLs.aspx" href="http://quickstarts.asp.net/3-5-extensions/adonetdataservice/SimpleAddressingSchemeForDataWithUniformURLs.aspx" target="_blank"&gt;http://quickstarts.asp.net/3-5-extensions/adonetdataservice/SimpleAddressingSchemeForDataWithUniformURLs.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Utilizzando la specifica sintassi prevista dal servizio si possono effettuare query e modifiche ai dati. In funzione del tipo di content type inviato nell'header http è possibile ottenere risposte con serializzazione XML o JSON.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt; E' possibile anche implementare dei Query Interceptors o Change Interceptor sul WebService per agganciare del nostro codice e gestire specifiche richieste di Query o modifiche. Ad esempio per intercettare e gestire le richieste di Query sui Customers del nostro esempio si dovrà aggiungere il seguente metodo:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;[QueryInterceptor("Customers")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public IQueryable&amp;lt;Customers&amp;gt; OnQueryOrders(IQueryable&amp;lt;Customers&amp;gt; customerQuery)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return from o in customerQuery&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; where o.ContactName ==HttpContext.Current.User.Identity.Name&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; select o;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;che fornirà esclusivamente accesso a quei customer dove il contactname corrisponde al nome dell'utente che sta accedendo al servizio. Per il Change Interceptor si utilizzerà l'attributo [ChangeInterceptor("......")] sul metodo Interceptor.&lt;/p&gt; &lt;p&gt;Oltre agli Interceptor è possibile estendere il servizio con dei nostri metodi custom attraverso quello che viene definito un Service Operation. Per aggiungere una Service Operation basta implementare uno specifico metodo come di seguito:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;em&gt;[WebGet]&lt;br&gt;public IQueryable&amp;lt;Model.Customers&amp;gt; CustomersInCity(string cityName)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return from c in this.CurrentDataSource.Customers&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where c.City == cityName&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select c;&lt;br&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Renderlo accessibile con la configurazione delle autorizzazioni:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;public static void InitializeService(IWebDataServiceConfiguration config)&lt;br&gt;{&lt;br&gt; ...&lt;br&gt; config.SetServiceOperationAccessRule("CustomersInCity", ServiceOperationRights.All);&lt;br&gt;} &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;e potrà essere acceduto attraverso il seguente URL:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;http://localhost:2759/WebSite1/Northwind.svc/CustomersInCity?cityName='Rome'&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Non soltando è possibile esporre dati ma utilizzando delle Service Operetions è possibile anche sfruttare gli attributi [SingleResult] e [MimeType] per realizzare interessanti combinazioni come ad esempio l'esposizione di template HTML collegati ai dati contenuti nel modello:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;em&gt;[MimeType("text/html")]&lt;br&gt;[SingleResult]&lt;br&gt;[WebGet]&lt;br&gt;public IQueryable&amp;lt;string&amp;gt; WelcomePage()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return new string[]&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; "&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Welcome&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;" +&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Welcome!&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Currently we have " +&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.CurrentDataSource.Customers.Count().ToString() + &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; " customers.&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }.AsQueryable();&lt;br&gt;}&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Accessibili poi con URL di questo tipo: &lt;p&gt;&amp;nbsp; &lt;p&gt;http://localhost:2759/WebSite1/Northwind.svc/WelcomePage/$value &lt;p&gt;Ad esempio è possibile anche creare dei Tempale XAML per Silverlight che possono essere direttamente valorizati con dei dati come nell'esempio precedente e poi caricati dinamicamente nell'applicazione RIA client chiamante utilizzando ad esempio una chiamata XmlHttpRequest con la funzione &lt;a href="http://msdn2.microsoft.com/en-us/library/bb980072.aspx" target="_blank"&gt;createfromxaml&lt;/a&gt; del plugin. &lt;p&gt;Abbiamo parlato prima delle due librerie client disponibili per l'accesso via JavaScript e via .NET. Per l'utilizzo AJAX sfruttiamo la libreria JS MicrosoftAjaxDataService.js che ci mette a dsiposizione la classe Sys.Data.DataService . Referenziando la libreria : &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;lt;asp:ScriptManager ID="ScriptManager1" runat="server"&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp; &amp;lt;Scripts&amp;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;&amp;nbsp; &amp;lt;asp:ScriptReference Name="MicrosoftAjaxDataService.js" /&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Scripts&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;lt;/asp:ScriptManager&amp;gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;è possibile utilizzare la libreria per effettuare un query sui dati come di seguito:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;var northwindService = new Sys.Data.DataService("/Northwind.svc"); &lt;/p&gt; &lt;p&gt;northwindService.query("/Customers", onSuccess, onFailure);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Dove onSuccess e onFailure sono rispettivamente i metodi invocati all'arrivo della risposta o in caso di errore :&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;function onFailure(error, context, operation) {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $get("spanResults").innerHTML = "Error occurred in operation " + operation + "."; &lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;function onSuccess(result, context, operation) {&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp; // Get Customers list and put into a table.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp; var sb = new Sys.StringBuilder(); &lt;/p&gt; &lt;p&gt;&amp;nbsp; sb.append("&amp;lt;table&amp;gt;"); &lt;/p&gt; &lt;p&gt;var firstRowOutput = false; &lt;/p&gt; &lt;p&gt;for (idx in result) {&lt;/p&gt; &lt;p&gt;&amp;nbsp; var customer = result[idx]; &lt;/p&gt; &lt;p&gt;&amp;nbsp; if (!firstRowOutput) { // Display the header row. &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; sb.append("&amp;lt;tr&amp;gt;"); for (key in customer) { &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; if (key != "__metadata") { &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;&amp;nbsp; sb.append("&amp;lt;th&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append(key); &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;&amp;nbsp; sb.append("&amp;lt;/th&amp;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;&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; } &lt;/p&gt; &lt;p&gt;sb.append("&amp;lt;/tr&amp;gt;"); &lt;/p&gt; &lt;p&gt;firstRowOutput = true;&lt;/p&gt; &lt;p&gt;} // Display the data. &lt;/p&gt; &lt;p&gt;sb.append("&amp;lt;tr&amp;gt;"); &lt;/p&gt; &lt;p&gt;for (key in customer) {&lt;/p&gt; &lt;p&gt;&amp;nbsp; if (key != "__metadata") { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append("&amp;lt;td&amp;gt;"); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append(customer[key]);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sb.append("&amp;lt;/td&amp;gt;"); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt; &lt;p&gt;} &lt;/p&gt; &lt;p&gt;sb.append("&amp;lt;/tr&amp;gt;");&lt;/p&gt; &lt;p&gt;} &lt;/p&gt; &lt;p&gt;sb.append("&amp;lt;/table&amp;gt;");&lt;/p&gt; &lt;p&gt;$get("spanResults").innerHTML = sb.toString();&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;La classe mette poi a disposizione le funzionalità per effettuare update ed insert.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Come già in precedenza segnalato è disponibile anche un namespace client .NET (Microsoft.Data.WebClient) per poter accedere con maggiore semplicità da client managed ai dati esposti da un servizio ASP.NET Data Service . &lt;/p&gt; &lt;p&gt;Attraverso la classe WebDataContext si gestisce il contesto verso uno specifico servizio e con la classe WebDataQuery si rappresentano e si eseguono le query verso la sorgente dati rappresentata da un WebDataContext:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;WebDataContext ctx = new WebDataContext(&lt;a href="http://localhost:51905/nw.svc"&gt;http://localhost:51905/nw.svc&lt;/a&gt;); &lt;/p&gt; &lt;p&gt;WebDataQuery&amp;lt;Customer&amp;gt; customers = ctx.CreateQuery&amp;lt;Customer&amp;gt;("/Customer"); &lt;/p&gt; &lt;p&gt;foreach (Customer r in customers) { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(c.CompanyName ); &lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;La CTP mette a disposizione anche un generatore di codice (WebDataGen.exe) che, partendo dai metadatid el servizio, ci genera un modello ad oggetti che ci permette di utilizzare LINQ per accedere al servizio:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;\Program Files\Microsoft ASP.NET 3.5 Extensions\WebDataGen.exe" /mode:ClientClassGeneration /outobjectlayer:northwind.cs /uri:http://localhost:8090/Northwind.svc&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Generato il modello con il tool è possibile utilizzare per accedere ai dati del servizio codice come il seguente:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;using System;&lt;/p&gt; &lt;p&gt;using Microsoft.Data.WebClient; &lt;/p&gt; &lt;p&gt;using System.Linq; &lt;/p&gt; &lt;p&gt;using NorthwindModel;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;namespace TestApplication { &lt;/p&gt; &lt;p&gt;class Program { &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; static void Main(string[] args) {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NorthwindEntities ctx = new NorthwindEntities(&lt;a href="http://localhost:8090/Northwind.svc"&gt;http://localhost:8090/Northwind.svc&lt;/a&gt;); &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.MergeOption = MergeOption.AppendOnly; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var q = from c in ctx.Customers where c.City == "London" orderby c.CompanyName select c; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var cust in q) {&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; Console.WriteLine(cust.CompanyName); &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; }&lt;/p&gt; &lt;p&gt;&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; }&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;La classe NorthwindEntities deriva da WebDataContext e permette di gestire con LINQ un approccio tipizzato.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Sono possibili anche operazioni di update,delete e insert.&amp;nbsp; L'autenticazione sul servizio avviene passando le credenziali con la classica interfaccia ICredentials.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Conclusioni&lt;/p&gt; &lt;p&gt;ADO.NET Data Service fornisce un nuova nuova sofisticata modalità per esporre , consumare sorgenti dati attraverso un approccio REST che consente di costruire con rapidità servizi in grado di supportare con efficacia le esigenze di accesso ai dati nei nuovi scenari Internet con particolare riferimento alle applicazioni RIA. &lt;/p&gt; &lt;p&gt;Per una introduzione alle funzionalità del servizio vi suggerisco il &lt;a href="http://quickstarts.asp.net/3-5-extensions/adonetdataservice/ADONETDataServicesFramework.aspx" target="_blank"&gt;QuickStart online&lt;/a&gt; , il &lt;a href="http://blogs.msdn.com/astoriateam/default.aspx" target="_blank"&gt;blog del team&lt;/a&gt; dove troverete anche le novità in arrivo , e segnalo inoltre&amp;nbsp; alcuni video realizzati sull'argomento:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/305/ADONET-Data-Services-Surfacing-Data.aspx" target="_blank"&gt;ADO.NET Data Services - Surfacing Data&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/306/ADONET-Data-Services-Querying-with-URIs.aspx" target="_blank"&gt;ADO.NET Data Services - Querying with URI's&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/309/ADONET-Data-Services-A-Basic-NET-Client.aspx" target="_blank"&gt;ADO.NET Data Services - A Basic .NET Client&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/307/ADONET-Data-Services-A-Basic-AJAX-Client.aspx" target="_blank"&gt;ADO.NET Data Services - A Basic AJAX Client&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/308/ADONET-Data-Services-A-Basic-Silverlight-Client.aspx" target="_blank"&gt;ADO.NET Data Services - A Basic Silverlight Client&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/310/ADONET-Data-Services-Querying-with-LINQ.aspx" target="_blank"&gt;ADO.NET Data Services - Querying with LINQ&lt;/a&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/311/ADONET-Data-Services-Query-Interceptors.aspx" target="_blank"&gt;ADO.NET Data Services - Query Interceptors&lt;/a&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.microsoft.com/uk/msdn/screencasts/screencast/312/ADONET-Data-Services-Service-Operations.aspx" target="_blank"&gt;ADO.NET Data Services - Service Operations&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8021678" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category></item><item><title>Pubblicato il codice sorgente di Tafiti ottimo esempio di utilizzo di Silverlight e Windows Live</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2007/12/20/pubblicato-il-codice-sorgente-di-tafiti-ottimo-esempio-di-utilizzo-di-silverlight-e-windows-live.aspx</link><pubDate>Thu, 20 Dec 2007 11:34:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6814713</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/6814713.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=6814713</wfw:commentRss><description>&lt;p&gt;&lt;img alt="Tafiti Search Visualization.png" src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=WLQuickApps&amp;amp;DownloadId=23983" align="right"&gt;&lt;/p&gt; &lt;p&gt;Per chi non l'avesse ancora visto sul sito delle &lt;a href="http://www.codeplex.com/WLQuickApps" target="_blank"&gt;Windows Live Quick Apps&lt;/a&gt; è stato rilasciato il codice sorgente di Tafiti, ottimo esempio di Silverlight e dell'utilizzo delle API web service di Windows Live. Sul sito&amp;nbsp;dedicato&amp;nbsp;a &lt;a href="http://tafiti.mslivelabs.com/" target="_blank"&gt;tafiti da ms live labs&lt;/a&gt;&amp;nbsp; potete scaricare il codice sorgente.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6814713" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item><item><title>Le 10 cose da conoscere su Silverlight per un CIO</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2007/09/22/le-10-cose-da-conoscere-su-silverlight-per-un-cio.aspx</link><pubDate>Sat, 22 Sep 2007 16:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5054906</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/5054906.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=5054906</wfw:commentRss><description>&lt;P&gt;&lt;A class="" title="Articolo CIO Magazine" href="http://www.cio.com/article/print/128700" mce_href="http://www.cio.com/article/print/128700"&gt;Articolo interessante&lt;/A&gt; dal CIO magazine che elenca le 10 principali caratteristiche di Silverlight che un CIO ha bisono di conosce per capire il ruolo di Silverlight all'interno dei nuovi scenari Web.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5054906" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/S_2B00_S/default.aspx">S+S</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category></item><item><title>Rilasciato Silverlight 1.0 e annunciato per Silverlight il supporto per Linux</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2007/09/05/rilasciato-silverlight-1-0-e-annunciato-per-silverlight-il-supporto-per-linux.aspx</link><pubDate>Wed, 05 Sep 2007 13:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:4760703</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/4760703.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=4760703</wfw:commentRss><description>&lt;P&gt;Post sul &lt;A class="" title="Silverlight 1.0 Released and Silverlight for Linux Announced" href="http://weblogs.asp.net/scottgu/archive/2007/09/04/silverlight-1-0-released-and-silverlight-for-linux-announced.aspx" target=_blank mce_href="http://weblogs.asp.net/scottgu/archive/2007/09/04/silverlight-1-0-released-and-silverlight-for-linux-announced.aspx"&gt;blog di Scott&lt;/A&gt; che annuncia il rilascio e i piano per il supporto per Linux in collaborazione con Novell:&lt;/P&gt;
&lt;P&gt;Alcuni siti già online con la RTM&amp;nbsp;tra cui :&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://mlb.mlb.com/media/video.jsp" target=_blank&gt;MLB.com&lt;/A&gt;&amp;nbsp;(Major League Baseball),&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://halo3.msn.com/videos.aspx" target=_blank&gt;Halo 3 preview&lt;/A&gt;&amp;nbsp;site (&lt;A href="http://halo3.msn.com/videosHD.aspx" target=_blank&gt;click here&lt;/A&gt; for the awesome&amp;nbsp;HD version),&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://www.tafiti.com/" target=_blank&gt;Tafiti.com&lt;/A&gt;, MSN Extra, and &lt;A href="http://election.msn.com/podium08.aspx" target=_blank&gt;MSN Podium '08&lt;/A&gt;.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;per una carrellata&amp;nbsp;di click su &amp;nbsp;&lt;A class="" title=Showcase href="http://silverlight.net/Showcase/" target=_blank mce_href="http://silverlight.net/Showcase/"&gt;Showcase&lt;/A&gt;&amp;nbsp; e presto arriveranno anche msn. e microsoft.com .&lt;/P&gt;
&lt;P&gt;Per partire ad utilizzare Silverlight per lo sviluppo: &lt;A class="" title="Silverlight Get Started" href="http://silverlight.net/GetStarted/" target=_blank mce_href="http://silverlight.net/GetStarted/"&gt;GetStarted&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4760703" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/RIA/default.aspx">RIA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Silverlight/default.aspx">Silverlight</category></item></channel></rss>