<?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 : .NET</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx</link><description>Tags: .NET</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Windows Azure Hello World !!</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2009/09/17/windows-azure-hello-world.aspx</link><pubDate>Thu, 17 Sep 2009 14:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9896352</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/9896352.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=9896352</wfw:commentRss><description>&lt;P&gt;Il cloud computing è una delle nuove e più interessanti frontiere del mondo dell’IT che si sta oramai affermando come una realtà e che promette di trasformare in modo significativo, la disponibilità delle classiche risorse che oggi cerchiamo in un hardware e in un sistema operativo installati in un data center locale. Con lo sviluppo per Internet di piattaforme di questo tipo, si aprono nuovi scenari che vanno oltre a quello che oggi è possibile fare in termini di servizi e dati sulla rete, aprendo la strada a veri e propri sistemi operativi self service dove si possono ottenere su richiesta ed in modo rapido, capacità di elaborazione, storage, servizi di database, etc . Diventa molto più semplice sviluppare nuove idee di servizi e soluzioni ed ottenere ad un minor costo le risorse per poterle sviluppare e pubblicare su Internet. Si avvia, inoltre, la pianificazione di una trasformazione di molti servizi aziendali che, nel tempo, si sposteranno nei nuovi grandi datacenter che, sviluppandosi in modo rapido, stanno materializzando l’infrastruttura per rendere il cloud computing una realtà.&lt;/P&gt;
&lt;P&gt;Con il rilascio della CTP di Agosto, la soluzione per il Cloud di Microsoft ovvero &lt;A href="http://www.azure.com/" mce_href="http://www.azure.com/"&gt;Windows Azure Platform &lt;/A&gt;si avvicina al rilascio ufficiale di una prima serie di servizi di Cloud Computing. La nuova release ci ha messo a disposizione una nuova versione degli strumenti di sviluppo e gli SDK per costruire soluzioni che possano poi essere distribuite e gestite sulla piattaforma, e la possibilità di accedere a degli spazi di test attivabili su richiesta e disponibili immediatamente per poter poi provare ad effettuare un deployment reale di dati ed applicazioni sulla piattaforma per il Cloud. Tra le novità più interessanti la trasformazione dei servizi di database che cambiano anche nome in Slq Azure e che ci mettono a disposizione una vera e propria infrastruttura Sql Sever pensata per il Cloud e utilizzabile su richiesta .&lt;/P&gt;
&lt;P&gt;Windows Azure Platform è una vera e propria piattaforma di sviluppo pensata per il Cloud Computing, ospitata in data center di Microsoft distribuiti in diverse zone del mondo, che fornisce un sistema operativo per il cloud (Windows Azure ) e un set di servizi per gli sviluppatori che possono essere utilizzati in combinazione o singolarmente, per sviluppare e eseguire nuove applicazioni che vengono poi gestite sulla nuova piattaforma e che possono integrarsi semplicemente anche con applicazioni locali già esistenti.&lt;/P&gt;
&lt;P&gt;Questa piattaforma oltre ad offrire i suoi servizi di base per un utilizzo diretto è anche l’infrastruttura sulla quale Microsoft sta sviluppando anche le sue soluzioni SaaS.&lt;/P&gt;
&lt;P&gt;Di seguito un’immagine della piattaforma complessiva &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image001_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image001_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image001 border=0 alt=clip_image001 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image001_thumb.jpg" width=541 height=252 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image001_thumb.jpg"&gt;&lt;/A&gt;&lt;U&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;Si va dai servizi di base offerti dal sistema operativo per il cloud Windows Azure, ai servizi di Internet Service Bus dei .NET Services, ai servizi di Database di Sql Azure.&lt;/P&gt;
&lt;P&gt;Con il sistema operativo per il cloud della Windows Azure Platform, ovvero Windows Azure vengono messe a disposizione, su richiesta, quelli che sono i servizi fondamentali che siamo abituati a trovare in un sistema operativo installato in un computer locale. Essenzialmente abbiamo:&lt;/P&gt;
&lt;P&gt;- Capacità di elaborazione&lt;/P&gt;
&lt;P&gt;- Storage (Tabelle, Blob, Code asincrone)&lt;/P&gt;
&lt;P&gt;- Deployment, Monitoring e Maintenance&lt;/P&gt;
&lt;P&gt;- Servizi automatici di Management, Load Balancers, DNS&lt;/P&gt;
&lt;P&gt;- Ambiente di programmazione&lt;/P&gt;
&lt;P&gt;I diversi servizi possono essere utilizzati in modo singolo o in combinazione tra loro per realizzare soluzione più complesse. Ad esempio lo storage può essere usato per depositare informazioni, dati o file, sia per applicazioni che poi si eseguono in Windows Azure sia per applicazioni che invece vengono eseguite localmente in un nostro datacenter e che usano lo storage del sistema operativo per il Cloud che è ospitato nei data center di Microsoft, sfruttando le API HTTP REST che la piattaforma mette a disposizione per questi servizi.&lt;U&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;La piattaforma fornisce le funzionalità e le risorse per le nostre applicazioni in base alle configurazioni impostate , garantendo una scalabilità praticamente infinita e un rapido adeguamento delle risorse fornite in base alle necessità richieste. I servizi vengono direttamente messi a disposizione delle applicazioni e tutta la classica attività di manutenzione, patching, monitoring del sistema di base, load balancing, DNS, etc , viene gestita automaticamente, liberandoci dai costi di gestione e manutenzione del software di base, permettendoci così, di concentrarci esclusivamente sul livello applicativo.&lt;/P&gt;
&lt;P&gt;Tutta la parte di amministrazione delle configurazioni e deployment di Windows Azure si può gestire attraverso l’interfaccia Web di amministrazione che si trova a &lt;A href="https://windows.azure.com/" mce_href="https://windows.azure.com/"&gt;https://windows.azure.com/&lt;/A&gt; dove si può accedere con il proprio Live Id &lt;STRONG&gt;accertandosi di aver prima impostato sulla nazionalità italiana i parametri di nazionalità del profilo del vostro LiveID su Windows Live &lt;/STRONG&gt;e creare un developer account. &lt;/P&gt;
&lt;P&gt;Potete verificare che sia impostata la nazionalità italiana sul vostro LiveID qui &lt;A href="https://account.live.com/"&gt;https://account.live.com/&lt;/A&gt; :&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_91C6/image_4.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_91C6/image_thumb_1.png" width=440 height=308&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Per eventualmente cambiarlo si può usare il menù Profile details ed entrare a modificare i dati del profilo della nazionalità.&lt;/P&gt;
&lt;P&gt;Tramite&amp;nbsp; l’ interfaccia del portale di Windows Azure si possono anche gestire le applicazioni che ed i servizi della piattaforma. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image003_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image003_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image003 border=0 alt=clip_image003 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image003_thumb.jpg" width=659 height=393 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image003_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Per poter successivamente creare una applicazione di test , oltre a registrarsi sul portale, occorre richiedere un token gratuito di test da utilizzare poi per l’attivazione, come spiegherò successivamente nel post quando procederemo alla pubblicazione dell’applicazione. &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Per poter sviluppare soluzioni per Windows Azure è disponibile anche un SDK e dei Tool completamente integrati con Visual Studio che mettono a disposizione degli specifici template per i progetti che possono essere scaricati da questa&amp;nbsp;&amp;nbsp; .&lt;U&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image005_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image005_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image005 border=0 alt=clip_image005 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image005_thumb.jpg" width=639 height=155 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image005_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;La parte di SDK e Tool Per Visual Studio permette di sviluppare e eseguire il test delle vostre applicazioni .NET e delle storage completamente in locale, per poi andare ad effettuare il deployment delle soluzioni realizzate e dei metadati di configurazione delle risorse sulla piattaforma nel cloud. Si possono scaricare SDK e Tool per Visual Studio da questa &lt;A href="http://www.microsoft.com/azure/sdk.mspx" target=_blank mce_href="http://www.microsoft.com/azure/sdk.mspx"&gt;pagina&lt;/A&gt;&amp;nbsp; e sullo stesso sito si può trovare anche un interessante e completo &lt;A href="http://www.microsoft.com/azure/trainingkit.mspx" target=_blank mce_href="http://www.microsoft.com/azure/trainingkit.mspx"&gt;training kit&lt;/A&gt; con laboratori guidati per tutti i servizi e un ampia offerta di &lt;A href="http://www.microsoft.com/azure/resources.mspx" target=_blank mce_href="http://www.microsoft.com/azure/resources.mspx"&gt;video e documenti&lt;/A&gt; . &lt;/P&gt;
&lt;P&gt;Con la parte di sistema operativo di base della Windows Azure Platform , ovvero Windows Azure possiamo sviluppare due tipologie di applicazione :&lt;/P&gt;
&lt;P&gt;- Web Role (ASP.NET, WCF Service, FastCGI, etc)&lt;/P&gt;
&lt;P&gt;- Worker Role&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image007_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image007_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image007 border=0 alt=clip_image007 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image007_thumb.jpg" width=548 height=345 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image007_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Le Web Role sono come dice la parola stessa delle Web Application basate su pagine Web o Web Services. &lt;/P&gt;
&lt;P&gt;I Worker Role sono invece delle applicazioni che si eseguono in background per la realizzazione di Task specifici, concettualmente molto simili a quello che possiamo fare con i Windows Service sulla versione di Windows tradizionale. Un utilizzo tipico dei Worker Role è l’implementazione di processi asincroni partendo dalla lettura di informazioni che vengono inserite in una delle code asincrone di Windows Azure. Ad esempio , immaginando una applicazione che gestisce l’acquisizione di ordini o la trasformazione di immagini o comunque operazioni che non possono essere eseguite in modo sincrono rispetto all’inserimento della richiesta , possono essere per l’appunto gestite con un Worker Role che resta in attesa di richieste su una coda e avvia l’esecuzione dello specifico lavoro alla ricezione di un messaggio, disaccoppiando così l’esecuzione rispetto all’inserimento della richiesta. Nel caso della ricezione di un ordine ad esempio, ci potrebbe essere una applicazione Web Role che riceve le richieste e che scrive nello storage le informazioni relative all’ordine e poi inserisce in una coda la richiesta di esecuzione dell’ordine , che viene così ricevuta ed eseguita in modo asincrono dal Worker Roler. Anche le code di Windows Azure come le tabelle per I dati e I blob per I file, sono utilizzabili attraverso le API HTTP REST e quindi possono anche essere utilizzate da applicazioni che sono installate localmente.&lt;/P&gt;
&lt;P&gt;Associate alle applicazioni, oltre alle componenti di codice , abbiamo a disposizione dei metadati che consentono di configurare le risorse che vogliamo utilizzare sulla piattaforma elaborativa. Ad esempio possiamo stabilire in modo molto semplice il numero di istanze che vogliamo avere a disposizione da Windows Azure e sulle quali vogliamo far eseguire la nostra applicazione. In base a queste informazioni, sia nell’ambiente di test locale al PC sia nel deployment reale nei datacenter, il servizio di management di Windows Azure denominato FABRIC, provvederà a effettuare il deployment delle istanze che abbiamo richiesto, configurare I bilanciatori di carico e a garantire il funzionamento delle istanze, riavviando o sostituendo istanze che eventualmente avessero dei malfunzionamenti. FABRIC si occupa anche del patching e del management delle macchine virtuali all’interno delle quali si eseguiranno le nostre istanze, garantendoci sicurezza, funzionalità e continuità di servizio per l’ambiente di base in cui si eseguono le nostre applicazioni. A disposizione, inoltre,&amp;nbsp; i servizi di log applicativo per monitorare il comportamento del nostro codice in esecuzione su Windows Azure.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image009_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image009_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image009 border=0 alt=clip_image009 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image009_thumb.jpg" width=480 height=361 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image009_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Per cominciare ad introdursi allo sviluppo con questa parte di base della Windows Azure Platform, potete provare a partire con la classica applicazione Hello World !! seguendo i passi che ho descritto di seguito e che permettono di introdursi allo sviluppo e debug con gli strumenti del SDK e di Visual Studio su un PC client, per poi successivamente procedere al deployment sulla infrastruttura di Windows Azure nel Cloud .&lt;/P&gt;
&lt;P&gt;Installato &lt;A href="http://www.microsoft.com/azure/sdk.mspx" target=_blank mce_href="http://www.microsoft.com/azure/sdk.mspx"&gt;Windows Azure SDK e Tool per Visual Studio&lt;/A&gt; troverete un nuovo template tra I progetti da selezionare per avviare lo sviluppo di una nuova applicazione per il cloud:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image011_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image011_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image011 border=0 alt=clip_image011 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image011_thumb.jpg" width=619 height=403 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image011_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Nello step successivo viene presentato un wizard che chiede il tipo di servizio che si vuole realizzare e procediamo con il selezionare una ASP.NET Web Role e proseguire&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image013_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image013_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image013 border=0 alt=clip_image013 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image013_thumb.jpg" width=728 height=534 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image013_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Nella soluzione creata dal template possiamo vedere una applicazione ASP.NET identica alle applicazioni che sviluppiamo per il deployment su una infrastruttura Windows tradizionale, ed in più la parte di progetto per Windows Azure con I metadati di configurazione che puoi consistono in dei file XML:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image015_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image015_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image015 border=0 alt=clip_image015 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image015_thumb.jpg" width=290 height=331 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image015_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Con gli opportuni accorgimenti è assolutamente possibile sviluppare applicazioni che possano essere poi distribuite su server locali o sul datacenter di Windows Azure. Questa particolarità rappresenta uno dei maggiori vantaggi di Windows Azure perchè si possono sviluppare applicazioni che poi possono avere differenti modelli di deployment in funzione delle esigenze. Se , infatti, impostiamo come progetto di avvio la Web Application ed eseguiamo il debug abbiamo il normale deployment dell’applicazione nel Web Server locale di Visual Studio, se invece (come di default in questo tipo di progetto) impostiamo come progetto di avvio la cloud application ed avviamo il debug, abbiamo l’avvio dell’infrastruttura locale di test del Windows Azure SDK in cui vengono create n istanze in base alle configurazioni che vedremo successivamente e vedrete comparire nella taskbar le icone del servizio di Development Storage e di Development Fabric:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image017_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image017_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image017 border=0 alt=clip_image017 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image017_thumb.jpg" width=178 height=70 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image017_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Facendo click sul servizio di Development Fabric ( la rotellina) protrete visualizzare la finestra di controllo del Development Fabric dove vedrete attiva la vostra applicazione, per il momento con una sola istanza. Potrete anche vedere la finestra in cui vengono visualizzate le informazioni inserite nel log dall’ambiente ed eventualmente dal vostro codice utilizzando le specifiche API di Windows Azure.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image019_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image019_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image019 border=0 alt=clip_image019 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image019_thumb.jpg" width=244 height=184 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image019_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Inseriamo una Label nella pagina di Default e scriviamo sul load della pagina una riga per impostare il contenuto della Label con la scritta Hello World:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image021_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image021_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image021 border=0 alt=clip_image021 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image021_thumb.jpg" width=309 height=100 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image021_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image023_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image023_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image023 border=0 alt=clip_image023 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image023_thumb.jpg" width=373 height=174 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image023_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Inserendo un breakpoint sulla riga di codice e riavviando l’applicazione in debug con progetto di avvio impostato sul progetto Cloud si potrà effettuare il debug dell’applicazione all’interno del Development Fabric di Windows Azure.&lt;/P&gt;
&lt;P&gt;Per poter richiedere l’avvio di più istanze di può utilizzare il file xml di configurazione del nostro servizio di Web Role che è contenuto nel progetto per il cloud e che ha l’estensione .cscfg:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image025_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image025_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image025 border=0 alt=clip_image025 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image025_thumb.jpg" width=737 height=215 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image025_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Oppure selezionare il WebRole ed utilizzare la finestra delle proprietà ottenendo lo stesso risultato di modifica del file di configurazione.&lt;/P&gt;
&lt;P&gt;Riavviando il progetto in debug, vedremo nella finestra della Development Fabric che questa volta sono state avviate 3 istanze come richiesto. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image027_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image027_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image027 border=0 alt=clip_image027 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image027_thumb.jpg" width=531 height=400 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image027_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Dal Task Manager del sitema operativo potete vedere i tre processi RdRoleHost.exe che contengono le tre istanze: &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image029_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image029_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image029 border=0 alt=clip_image029 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image029_thumb.jpg" width=669 height=307 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image029_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Potete provare a terminare una delle istanze dei processi contenitore e noterete che la Development Fabric la riavvierà automaticamente.&lt;/P&gt;
&lt;P&gt;Riportiamo le istanze a 1 e riavviando verifichiamo che viene nuovamente caricata una sola istanza. Ricordatevi di riportare a 1 le istanze prima del deployment nell’applicazione di test su Windows Azure.&lt;/P&gt;
&lt;P&gt;Dopo esservi registrati sul portale &lt;A href="http://windows.azure.com/" mce_href="http://windows.azure.com"&gt;http://windows.azure.com&lt;/A&gt; con il vostro &lt;STRONG&gt;Live Id accertandosi&amp;nbsp; come spiegato prima di aver prima impostato sulla nazionalità italiana i parametri di nazionalità del profilo del vostro LiveID su Windows Live&lt;/STRONG&gt; , per poter effettuare il deployment&amp;nbsp; nel datacenter nel cloud occorre prima creare dal menù di Windows Azure una nuova applicazione in cui effettuare il deployment del nostro esempio. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Per attivare una applicazione, occorre ottenere un token di attivazione. Con la CTP di Agosto di Windows Azure è possibile ottenere dei token gratuiti di test attraverso il portale Microsoft Connect. Utilizzando il token di test si potra procedere al deployment.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Per richiedere il token di attivazione basta fare click sul link specifico nell'area Deploy a questa pagina &lt;A href="http://www.microsoft.com/windowsazure/getstarted/"&gt;http://www.microsoft.com/windowsazure/getstarted/&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image031_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image031_2.jpg"&gt;&lt;/A&gt;&lt;/U&gt;&lt;U&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Il link vi porta sul portale Connect dove dopo essersi autenticati con Il Live ID di nazionalità italiana potrete richiedere il token di test gratuito da usare poi per attivare l’applicazione sul portale &lt;/STRONG&gt;&lt;A href="https://windows.azure.com/" mce_href="https://windows.azure.com/"&gt;&lt;STRONG&gt;https://windows.azure.com/&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; . Il token vi verrà spedito appena disponibile (genericamente 48 ore)&amp;nbsp;sulla cassetta postale&amp;nbsp; del Live Id con cui l'avete richiesto iscrivendovi a connect.&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Il token dovrà essere inserito utilizzando il Link Account sul menù della Home Page del portale &lt;A href="https://windows.azure.com/" mce_href="https://windows.azure.com/"&gt;https://windows.azure.com/&lt;/A&gt; . Nell’area account c’è un link Manage My Tokens &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image033_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image033_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image033 border=0 alt=clip_image033 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image033_thumb.jpg" width=728 height=254 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image033_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Dove potete inserire il token che avete ottenuto registrandovi sul portale Connect .&lt;U&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;Inserito il token facendo click sul voce del menù sulla destra Windows Azure, potrete accedere alla pagina di provisioning dove ora troverete attivato un progetto PDC08 come da figura che si è attivato con l’inserimento del token. Accedendo con il click sul link evidenziato del progetto &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image035_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image035_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image035 border=0 alt=clip_image035 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image035_thumb.jpg" width=646 height=261 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image035_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;potrete entrare nella pagina del progetto per aggiungere una applicazione con lo specifico comando New Service evidenziato&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image037_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image037_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image037 border=0 alt=clip_image037 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image037_thumb.jpg" width=655 height=292 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image037_thumb.jpg"&gt;&lt;/A&gt;&lt;U&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;Nello step successivo potrete creare una nuova Hosted Application chiamandola ad esempio test Azure usando lo specifico bottone (evidenziato sotto) e anche eventualmente uno spazio di storage . Per il nostro esercizio al momento basta la creazione della Hosted Application.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image039_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image039_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image039 border=0 alt=clip_image039 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image039_thumb.jpg" width=662 height=289 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image039_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Il wizard di creazione della hosted application prosegue chiedendovi le informazioni relative al nome con cui volete pubblicare lo spazio e le eventuali affinità con una specifica region e l’affinità eventuale con uno storage. Impostate solo un nome e lasciate le altre impostazioni sul default:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image041_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image041_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image041 border=0 alt=clip_image041 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image041_thumb.jpg" width=666 height=332 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image041_thumb.jpg"&gt;&lt;/A&gt;&lt;U&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;Preparato lo spazio per l’applicazione procediamo con il preparare il package di deployment. Dal menù Build di Visual Studio facendo click sulla voce Publish Cloud … o direttamente dal menù contestuale della Cloud Application in Visual Studio:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image043_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image043_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image043 border=0 alt=clip_image043 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image043_thumb.jpg" width=259 height=284 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image043_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Si otterrà la produzione da parte di Visual Studio del package di deployment della soluzione e dei file xml con i dati di configurazione &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image045_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image045_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image045 border=0 alt=clip_image045 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image045_thumb.jpg" width=533 height=240 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image045_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Verrà anche automaticamente aperto il browser con impostato l’url di deployment . Effettuato il logon nel portale di Windows Azure con il vostro Live Id con cui vi siete già registrati vi troverete nella pagina delle applicazioni in gestione e selezionando l’applicazione che avete attivato prima tramite il token.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image047_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image047_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image047 border=0 alt=clip_image047 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image047_thumb.jpg" width=555 height=270 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image047_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Con il pulsante deploy potrete provedere a portarvi sulla pagina di deployment ed a inserire con gli opportuni comandi di selezione di file il pakage dell’applicazione ed i metadati:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image049_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image049_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image049 border=0 alt=clip_image049 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image049_thumb.jpg" width=555 height=363 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image049_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image051_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image051_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image051 border=0 alt=clip_image051 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image051_thumb.jpg" width=558 height=374 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image051_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Terminata l’operazione di caricamento dei file vi ritroverete sulla pagina di gestione del progetto con i due ambienti di Produzione e di staging e con il pulsante Run posizionanto sotto l’area di staging potrete avviare l’applicazione in staging. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image053_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image053_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image053 border=0 alt=clip_image053 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image053_thumb.jpg" width=561 height=390 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image053_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Un apposito box vi segnala lo stato di avanzamento dell’operazione di avvio dell’istanza e l’url a cui sarà disponibile l’applicazione terminata l’operazione di avvio:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image055_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image055_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image055 border=0 alt=clip_image055 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image055_thumb.jpg" width=553 height=408 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image055_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Successivamente alla ricezione della conferma dell’avvio dellavostra applicazione:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image057_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image057_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image057 border=0 alt=clip_image057 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image057_thumb.jpg" width=558 height=414 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image057_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Potrete utilizzare l’URL indicato per navigare nella applicazione in staging ed eventualmente promuoverla in produzione con lo specifico comando.&lt;/P&gt;
&lt;P&gt;Con il pulsante Configure, invece, potrete accedere alla pagina che vi consente di modificare la parte di configurazione delle istanze e di accedere al log delle applicazioni:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image059_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image059_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=clip_image059 border=0 alt=clip_image059 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image059_thumb.jpg" width=565 height=461 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/WindowsAzureHelloWorld_DBD8/clip_image059_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9896352" 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/Visual+Studio/default.aspx">Visual Studio</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/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Windows+Azure/default.aspx">Windows Azure</category></item><item><title>Rai Net have expanded use of Live Smooth Streaming for Sports Event: Roma 09 FINA Swimming world championships and Berlin 2009 Athletics World Championships</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2009/09/11/rai-net-have-expanded-use-of-live-smooth-streaming-for-sports-event-roma-09-fina-swimming-world-championships-and-berlin-2009-athletics-world-championships.aspx</link><pubDate>Fri, 11 Sep 2009 08:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9894017</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/9894017.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=9894017</wfw:commentRss><description>&lt;P&gt;How I introduced in my &lt;A href="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" target=_blank mce_href="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"&gt;previous post&lt;/A&gt; , Rai Net the internet company of RAI, the Italian public broadcaster, during the last FIFA Confederations Cup South Africa 2009 delivered free, live Web broadcasting in high definition television quality (720p) of the Italian soccer team matches during the tournament using Live Smooth Streaming . &lt;/P&gt;
&lt;P&gt;Smooth Streaming is an innovative technology based on &lt;A href="http://www.iis.net/media" target=_blank 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.&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&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;In my &lt;A href="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" target=_blank mce_href="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"&gt;previous post&lt;/A&gt; for Confederation Cup and for Smooth Streaming and in general and in the &lt;A href="http://www.iis.net/media" target=_blank mce_href="http://www.iis.net/media"&gt;official web site&lt;/A&gt; , you can found more information about this innovative technology &lt;/P&gt;
&lt;P&gt;After the success of this first test for Live Smooth Streaming, Rai Net have expanded the use of this technology for sports event on Rai Sport portal and delivered, up to true HD for Live and VOD after the Live event: Roma 09 FINA Swimming world championships and Berlin 2009 Athletics World Championships.&lt;/P&gt;
&lt;P&gt;In the follow pictures you can see some screen shots from Rai Sport Web Site from Roma 09 FINA Swimming world championships were you can see the adaptive part of smooth streaming at work:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image002_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image002_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image002 border=0 alt=clip_image002 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image002_thumb.jpg" width=663 height=430 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image002_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;An from Berlin 2009 Athletics World Championships:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image004_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image004_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image004 border=0 alt=clip_image004 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image004_thumb.jpg" width=658 height=533 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image004_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image006_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image006_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image006 border=0 alt=clip_image006 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image006_thumb.jpg" width=659 height=520 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image006_thumb.jpg"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The architecture used for these events is practically the same used for the Confederation Cup and illustrated in the &lt;A href="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" target=_blank mce_href="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"&gt;previous post&lt;/A&gt;, with the exception of the CDN because for this event RAI use two different CDN and balance the load on both at 50%. In the follow picture you can see the architecture used for these two events:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image008_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image008_2.jpg"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=clip_image008 border=0 alt=clip_image008 src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image008_thumb.jpg" width=665 height=451 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/RaiNethaveexpandeduseofLiveSmoothStreami_632A/clip_image008_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. 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 two 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=9894017" 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/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>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>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>Yoox dal retail alla piattaforma multibrand per e-commerce</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/06/16/yoox-dal-retail-alla-piattaforma-multibrand-per-e-commerce.aspx</link><pubDate>Mon, 16 Jun 2008 10:30:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8592977</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8592977.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8592977</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; margin: 0px 7px 0px 0px; border-left: 0px; border-bottom: 0px" height="216" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/image_thumb.png" width="260" align="left" border="0" /&gt;&lt;/a&gt; Una delle attivit&amp;#224; pi&amp;#249; interessanti che mi &amp;#232; capitato di seguire negli ultimi mesi &amp;#232; collegata alla revisione architetturale che Yoox Group ha avviato sui suoi servizi e siti Internet.&lt;/p&gt;  &lt;p&gt;YOOX Group &amp;#232; il partner globale di Internet retail per i principali brand di moda &amp;amp; design: l&amp;#8217;unica azienda di retail su Internet sia multimarca &amp;#8211; con la boutique virtuale &lt;a href="http://yoox.com/"&gt;YOOX.COM&lt;/a&gt;, sia monomarca &amp;#8211; con i flagship store online sviluppati da YOOX Services.&lt;/p&gt;  &lt;p&gt;Nato nel 2000 ha avviato un nuovo modello di business con la boutique virtuale N&amp;#176; 1 al mondo &lt;a href="http://yoox.com/"&gt;YOOX.COM&lt;/a&gt;, che ha contribuito pionieristicamente a creare lo shopping di moda online nel nostro Paese. &lt;/p&gt;  &lt;p&gt;L&amp;#8217;infrastruttura globale sincronizzata su tre continenti, insieme all&amp;#8217;esperienza accumulata in questi anni, hanno portato all&amp;#8217;apertura nel 2006 di YOOX Services, societ&amp;#224; di YOOX Group che progetta e gestisce gli online store per conto dei principali brand di moda &amp;amp; design. YOOX Services realizza i flagship store dei principali brand della moda &amp;amp; design che intendono offrire online la stessa collezione disponibile attualmente nei negozi. &lt;/p&gt;  &lt;p&gt;Attualmente i flagship store online monomarca &amp;#8220;powered by YOOX&amp;#8221; sono: &lt;a href="http://www.marni.com"&gt;www.marni.com&lt;/a&gt;, &lt;a href="http://www.emporioarmani.com/"&gt;www.emporioarmani.com&lt;/a&gt;, &lt;a href="http://www.diesel.com/"&gt;www.diesel.com&lt;/a&gt;, &lt;a href="http://www.cpcompany.com/"&gt;www.cpcompany.com&lt;/a&gt;, &lt;a href="http://www.stoneisland.com/"&gt;www.stoneisland.com&lt;/a&gt; e presto saranno annunciati molti altri virtual store dei principali brand del lusso. &lt;/p&gt;  &lt;p&gt;A questi si &amp;#232; aggiunto il nuovissimo &lt;a href="http://thecorner.com/"&gt;THECORNER.COM&lt;/a&gt; &amp;#8220;powered by YOOX&amp;#8221;, un department store online completamente dedicato alle nuove collezioni di designer internazionali &amp;#8221;cutting edge&amp;#8221; e a brand italiani di ricerca ognuno con un &amp;#8220;corner&amp;#8221; dedicato.&lt;/p&gt;  &lt;p&gt;Una case history di successo se guardiamo i numeri di YOOX.COM: un sito localizzato in 7 lingue con pi&amp;#249; di quattro milioni di visitatori al mese e pi&amp;#249; di un milione di capi consegnati in tutto il mondo nel 2007 in 53 paesi. &lt;/p&gt;  &lt;p&gt;Dal punto di vista tecnico la necessit&amp;#224; di dover passare da un singolo Internet retailer ad una nuova serie di siti monobrand ha comportato la necessit&amp;#224; di una profonda revisione dell&amp;#8217;architettura su cui yoox services implementa le soluzioni Internet. I piani di Yoox Group, infatti, prevedono lo sviluppo di un numero significativo di siti monbrand o specialistici e pertanto la nuova piattaforma tecnologica per Yoox Service dovr&amp;#224; prevedere la possibilit&amp;#224; di implementare e gestire con sempre maggiore velocit&amp;#224; nuove tipologie di siti. &lt;/p&gt;  &lt;p&gt;Dal punto di vista architetturale Yoox Services si &amp;#232; trovata di fronte all&amp;#8217;esigenza di muovere la propria soluzione per yoox.com da un sito di e-commerce ad una vera e propria piattaforma che possa permettere la costruzione e la gestione di &amp;#8220;n&amp;#8221; siti, mettendo a fattor comune un insieme di servizi di base con lo scopo di semplificare lo sviluppo , manutenzione e sfruttamento dell&amp;#8217;hardware, ma permettendo al tempo stesso il necessario isolamento tra i siti, la flessibilit&amp;#224; per gli elementi di interfaccia utente e la costruzione dei contenuti di ciascuno store virtuale, garantendo allo stesso tempo la necessaria scalabilit&amp;#224; rispetto al volume di richieste gi&amp;#224; oggi elevato sul solo Yoox.com.&lt;/p&gt;  &lt;p&gt;Per rispondere a queste esigenze Yoox Group ha quindi avviato uno studio per l&amp;#8217;implementazione di una nuova piattaforma che viene da identificata con il termine OSS (ONLINE STORE SERVICES) per rispondere alle nuove esigenze del gruppo e garantire gli stessi livelli di qualit&amp;#224; , scalabilit&amp;#224; e costi offerti dalla soluzione che ha contribuito in modo determinate al successo di Yoox.com.&lt;/p&gt;  &lt;p&gt;La nuova architettura &amp;#232; divisa in due componenti fondamentali: una componenti di front-end che si preoccupa di gestire acquisizione di ordini e gestione del sito (catalogo, profili, carrello, pagamenti, etc) ed una componente di back-end che riceve gli ordini attraverso un un meccanismo di code asincrone dove attraverso Microsoft BizTalk e Microsoft Navision vengono gestite le interazioni con i partner , le operazioni logistiche di spedizione e la fatturazione. &lt;/p&gt;  &lt;p&gt;La componente di front-end prevede una parte di user interface (UI) , una serie di Web Service per erogazione di servizi a siti terzi (ad esempio il catalogo) ed alle componenti lato client della UI (JS AJAX, FLASH, SILVERLIGHT, WPF\.NET) , una parte di servizi con la logica delle operazioni del sito e uno storage per i dati.&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image004_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="268" alt="clip_image004" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image004_thumb.jpg" width="357" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I principi architetturali che guidano il rifacimento della componente di front-end che si &amp;#232; deciso di seguire per l&amp;#8217;evoluzione dal mono sito a multi sito possono essere rappresentati come indicato nella seguente figura:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image006_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="367" alt="clip_image006" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image006_thumb.jpg" width="386" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;L&amp;#8217;idea guida di base &amp;#232; quella di passare da un&amp;#8217;architettura single-tenant dove ciascuna istanza dei siti &amp;#232; implementata con una singola soluzione adhoc\custom ,ad una piattaforma che ricalchi la struttura di base dei servizi offerti attualmente in yoox.com, fornendoli con una architettura multi-tenant scalabile e configurabile. I principi architetturali impostati partono dalle idee impostate per le architetture SaaS e quindi gran parte delle impostazioni sulle architetture multi-tenant indicate ottimo &lt;a href="http://msdn.microsoft.com/en-us/architecture/aa479069.aspx"&gt;documento di Carraro e Chong&lt;/a&gt; sull&amp;#8217;argomento, ma vengono riadattati alle forti esigenze di flessibilit&amp;#224; sugli aspetti di personalizzazione del front-end ed di gestione dei contenuti dello stesso necessari ad una applicazione di questo tipo.&lt;/p&gt;  &lt;p&gt;Dal punto di vista tecnologico nell&amp;#8217;implementazione della nuova architettura in corso di sviluppo Yoox ha scelto di utilizzare nelle componenti fondamentali la piattaforma Microsoft: Windows Server 2008 con IIS7 come piattaforma Web Server, SQL Server 2008 come storage e .NET 3.5 come framework di sviluppo con Visual Studio Team System e Team Foundation Server per l&amp;#8217;implementazione della software factory, Navision e Microsoft BizTalk Server nelle componenti di back-end.&lt;/p&gt;  &lt;p&gt;Ulteriore vincolo per la nuova architettura consiste nella necessit&amp;#224; di migrare per step successivi anche il sito principale yoox.com e di garantire,quindi, una completa continuit&amp;#224; di funzionamento. Proprio per questo motivo la migrazione dalla precedente architettura single-tenant basata su ASP/COM sta procedendo per step che prevedono come prima parte la costruzione dei nuovi servizi e l&amp;#8217;aggancio di questi alla attuale interfaccia. Terminata la costruzione dei nuovi servizi, verr&amp;#224; anche migrata la tecnologia utilizzata per la parte di interfaccia utente.&lt;/p&gt;  &lt;p&gt;Data la particolarit&amp;#224; della natura dei siti, infatti , la profonda necessit&amp;#224; di personalizzazione delle componenti di UI &amp;#232; una delle caratteristiche che a spinto Yoox alla decisione di mantenere quest&amp;#8217;ultimo aspetto sviluppato ad hoc per ogni tenant. In particolare , oltre alla classica interfaccia HTML sono previste anche interfacce di tipo differente tra cui piccoli smart client residenti sul desktop che offriranno agli utenti la possibilit&amp;#224; di un interazione pi&amp;#249; semplice con il catalogo del sito. Anche le componenti di UI di gestione del sito sono costruite con interfacce smart client.&lt;/p&gt;  &lt;p&gt;L&amp;#8217;architettura principale del nuovo front-end multi sito di YOOX pu&amp;#242; quindi essere rappresentata come di seguito:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image008_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="306" alt="clip_image008" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image008_thumb.jpg" width="376" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Le interfacce utente di ciascun tenant\sito accedono ai sevizi forniti dal OSS fornendo sempre un parametro che identifica il tenant stesso e ottenendo in questo modo l&amp;#8217;accesso alla logica ed ai dati necessari al funzionamento della specifica istanza. Con questo tipo di approccio, ciascun elemento applicativo pu&amp;#242; scalare con un approccio orizzontale che comporta la semplice aggiunta di macchine fisiche o virtuali all&amp;#8217;architettura su tutti gli strati applicativi , compresa la parte di dati. Anche a questo livello, infatti, viene utilizzato un partizionamento dei dati rispetto alle istanze che identificano i tenant . Questo approccio consente di suddividere i dati in differenti database che possono anche essere ospitati su macchine fisiche o virtuali diverse in funzione delle esigenze di scalabilita. Lo strato di accesso ai dati dei servizi conterr&amp;#224; la logica necessaria ad individuare la partizione corretta in base all&amp;#8217;identificativo del tenant\ sito fornito dal chiamante :&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image010_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="384" alt="clip_image010" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image010_thumb.jpg" width="518" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Per un chiarimento sul tema del partizionamento dei dati vi rimando ai post fatti in passato sull argomento la scalabilit&amp;#224; ed il partizionamento in entit&amp;#224; parte 1 e parte 2 . Il disaccoppiamento tra front-end e back-end attraverso l&amp;#8217;utilizzo di una coda fa si che il carico prodotto nell&amp;#8217;inserimento di ordini o dalla navigazione degli utenti, non si rifletta direttamente sulle componenti che gestiscono le fasi di fatturazione e gestione logistica e di spedizione.&lt;/p&gt;  &lt;p&gt;I servizi sono sviluppati con tre differenti interfacce per permettere sia l&amp;#8217;interazione con le pagine ASP (COM), sia l&amp;#8217;interazione con componenti .NET in process , sia una interfaccia REST con XML o JSON . In questo modo ciascun servizio pu&amp;#242; o essere direttamente posizionato sulle macchine di front-end per essere consumato da UI HTML o per poter essere eventualmente esposto verso altre applicazioni ad estensione delle potenzialit&amp;#224; della piattaforma stessa. &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image012_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="351" alt="clip_image012" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image012_thumb.jpg" width="450" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La maggior parte dei servizi utilizza WCF (Windows Communication Foundation) per esporre una parte delle interfacce di accesso e nello strato di accesso ai dati sfruttano le nuove funzionalit&amp;#224; offerte da LINQ.&lt;/p&gt;  &lt;p&gt;La struttura complessiva del sito pu&amp;#242; essere quindi rappresentata come di seguito:&lt;/p&gt;  &lt;p align="center"&gt;&amp;#160;&lt;a href="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image014_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="344" alt="clip_image014" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/ad51ccc86a33_B7B8/clip_image014_thumb.jpg" width="462" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8592977" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/VSTS/default.aspx">VSTS</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Software+Factories/default.aspx">Software Factories</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/SOA/default.aspx">SOA</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/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/ORM/default.aspx">ORM</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/TFS/default.aspx">TFS</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/REST/default.aspx">REST</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/BPM/default.aspx">BPM</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Orcas/default.aspx">Orcas</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/Silverlight/default.aspx">Silverlight</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/IIS7/default.aspx">IIS7</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>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>Sessioni del lancio online</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/04/03/sessioni-del-lancio-online.aspx</link><pubDate>Thu, 03 Apr 2008 17:21:32 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8353927</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8353927.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8353927</wfw:commentRss><description>&lt;p&gt;Disponibili &lt;a href="http://www.microsoft.com/italy/beit/sezioni.aspx" target="_blank"&gt;online le sessioni del lancio&lt;/a&gt;. In particolare disponibile anche video e slide della sessione che ho preparato con Mario Fontana e Mauro Minella sul tema&amp;#160; Visual Tools For Office da titolo &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/italy/beit/sezione_video.aspx?vid=14" target="_blank"&gt;&amp;quot;Sviluppo di applicazioni per Microsoft Office System&amp;quot;&lt;/a&gt; &lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://www.microsoft.com/italy/beit/sezioni.aspx"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="320" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/Sessionidellancioonline_E5E1/image_3.png" width="758" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8353927" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/VSTS/default.aspx">VSTS</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/ORM/default.aspx">ORM</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/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/VSTO/default.aspx">VSTO</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Architecture/default.aspx">Architecture</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>Sql Server Data Services : il database come servizio, un altro esempio di S+S</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/07/sql-server-data-service-il-database-come-servizio-un-altro-esempio-di-s-s.aspx</link><pubDate>Fri, 07 Mar 2008 14:18:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8092912</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8092912.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8092912</wfw:commentRss><description>&lt;P&gt;Tra le tantissime novità annunciate al MIX 08 ( per chi volesse vedere le sessioni dell'evento &lt;A title=http://sessions.visitmix.com/ href="http://sessions.visitmix.com/" target=_blank mce_href="http://sessions.visitmix.com/"&gt;http://sessions.visitmix.com/&lt;/A&gt;&amp;nbsp; ) una delle più interessanti nell'ottica del mondo &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;S+S/SaaS&lt;/A&gt; e di tutte le implicazioni che questo modello comporta per le applicazioni e per 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;aziende&lt;/A&gt; e per i produttori di software è rappresentata dal nuovo servizio&lt;STRONG&gt; &lt;A href="http://www.microsoft.com/sql/dataservices/default.mspx" target=_blank mce_href="http://www.microsoft.com/sql/dataservices/default.mspx"&gt;Sql Server Data Services&lt;/A&gt;&lt;/STRONG&gt;. &lt;/P&gt;
&lt;P&gt;Si tratta di un vero e proprio Data Service&amp;nbsp; che viene incontro sia alle esigenze delle applicazioni web di cui parlavo nel post su &lt;A href="http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/04/ado-net-data-service.aspx" target=_blank mce_href="http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/04/ado-net-data-service.aspx"&gt;ADO.NET Data Service&lt;/A&gt; sia alle esigenze di aziende di diverse dimensioni relativamente alla gestione dei dati.&lt;/P&gt;
&lt;P&gt;Il servizio&amp;nbsp;offre la possibilità di disporre di data storage,&amp;nbsp;accessibili direttamente online su Internet,&amp;nbsp;&amp;nbsp;progressivamente scalabili su richiesta,&amp;nbsp;senza dover installare&amp;nbsp;nel nostro data center rilevanti quantità di Hardware che poi vanno gestite e manutenute.&lt;/P&gt;
&lt;P&gt;L'accesso alle informazioni inserite nel servizio è possibile attraverso delle interfacce web service (SOAP,e REST) ed è possibile utilizzare un modello ad oggetti client che permette di utilizzare LINQ per gestire ed accedere alle Entità che verranno inserite nel servizio. Presenti anche tutti gli strumenti per l'amministrazione e la configurazione degli aspetti di sicurezza che sfrutteranno ovviamente Windows LiveId con tutte le sue potenzialità di federazione.&lt;/P&gt;
&lt;P&gt;La sessione specifica di MIX08 sull'argomento tenuta da Nigel Ellis (Architect del servizio ) sarà a breve on line&amp;nbsp;sempre a &lt;A title=http://sessions.visitmix.com/ href="http://sessions.visitmix.com/" target=_blank mce_href="http://sessions.visitmix.com/"&gt;http://sessions.visitmix.com/&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Interessante sull'argomento il post di&amp;nbsp; &lt;A title="Eugenio Pace - Software as a Service Architecture Guidance" href="http://blogs.msdn.com/eugeniop/archive/2008/03/05/sql-server-data-services-sdss-new-version-of-litwarehr.aspx" mce_href="http://blogs.msdn.com/eugeniop/archive/2008/03/05/sql-server-data-services-sdss-new-version-of-litwarehr.aspx"&gt;Eugenio Pace - Software as a Service Architecture Guidance&lt;/A&gt; sul lavoro di integrazione del servizio con le guidance SaaS e S+S dell'architecture strategy team e l'evoluzione che stanno implementando nell'applicazione reference LitwareHR dove per l'appunto verrà sfruttato il nuovo servizio come storage.&lt;/P&gt;
&lt;P&gt;Per chi vuole provare la beta : &lt;A title=http://www.microsoft.com/sql/dataservices/default.mspx href="http://www.microsoft.com/sql/dataservices/default.mspx" mce_href="http://www.microsoft.com/sql/dataservices/default.mspx"&gt;http://www.microsoft.com/sql/dataservices/default.mspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Blog del team :&lt;A title=http://blogs.msdn.com/ssds/ href="http://blogs.msdn.com/ssds/" target=_blank mce_href="http://blogs.msdn.com/ssds/"&gt;http://blogs.msdn.com/ssds/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;FAQ del servizio:&lt;A title=http://www.microsoft.com/sql/dataservices/faq.mspx href="http://www.microsoft.com/sql/dataservices/faq.mspx" mce_href="http://www.microsoft.com/sql/dataservices/faq.mspx"&gt;http://www.microsoft.com/sql/dataservices/faq.mspx&lt;/A&gt;&lt;/P&gt;&lt;A title=http://www.microsoft.com/sql/dataservices/faq.mspx href="http://www.microsoft.com/sql/dataservices/faq.mspx" mce_href="http://www.microsoft.com/sql/dataservices/faq.mspx"&gt;&lt;/A&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8092912" 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/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/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></item><item><title>Articoli interessante da MSDN Magazine: integrazione WCF / WF, VSTO 3.0, MOBILE WCF , IIS 7</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/03/07/articoli-interessante-da-msdn-magazine-integrazione-wcf-wf-vsto-3-0-mobile-wcf-iis-7.aspx</link><pubDate>Fri, 07 Mar 2008 11:21:55 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8089710</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/8089710.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=8089710</wfw:commentRss><description>&lt;p&gt;Segnalo alcuni articoli interessanti disponibili su MSDN Magazine.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Il primo riguarda l'integrazione tra WF e WCF ovvero i Workflow Services:&lt;/p&gt;  &lt;p&gt;&lt;a title="Workflow Services" href="http://msdn2.microsoft.com/en-us/magazine/cc164251.aspx" target="_blank"&gt;Workflow Services&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Il secondo lo sviluppo di Business Application con VSTO:&lt;/p&gt;  &lt;p&gt;&lt;a title="Developing Office Business Apps with Visual Studio 2008" href="http://msdn2.microsoft.com/en-us/magazine/cc164242.aspx" target="_blank"&gt;Developing Office Business Apps with Visual Studio 2008&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;il terzo lo sviluppo con WCF su device mobile con il compact framework 3.5:&lt;/p&gt;  &lt;p&gt;&lt;a title="Write an IM App with the .NET Compact Framework" href="http://msdn2.microsoft.com/en-us/magazine/cc164240.aspx" target="_blank"&gt;Write an IM App with the .NET Compact Framework&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Il quarto &amp;#232; relativo all'estendibilit&amp;#224; di IIS7&lt;/p&gt;  &lt;p&gt;&lt;a title="Build Web Server Solutions with End-To-End Extensibility" href="http://msdn2.microsoft.com/en-us/magazine/cc164241.aspx" target="_blank"&gt;Build Web Server Solutions with End-To-End Extensibility&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8089710" 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/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/Orcas/default.aspx">Orcas</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/VSTO/default.aspx">VSTO</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/WF/default.aspx">WF</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/IIS7/default.aspx">IIS7</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>Servizi online e Office : un esempio dal mondo reale</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/02/12/servizi-online-e-office-un-esempio-dal-mondo-reale.aspx</link><pubDate>Tue, 12 Feb 2008 11:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7634868</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/7634868.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=7634868</wfw:commentRss><description>&lt;P&gt;Un ottimo esempio di &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;Software + Services (S+S)&lt;/A&gt; e di &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;integrazione dei servizi su internet&amp;nbsp; con applicazioni nell'azienda&lt;/A&gt; ed in particolare con Office System&amp;nbsp; attraverso i &lt;A href="http://blogs.msdn.com/giuseppeguerrasio/archive/2007/09/07/video-introduzione-oba-office-business-application.aspx" target=_blank mce_href="http://blogs.msdn.com/giuseppeguerrasio/archive/2007/09/07/video-introduzione-oba-office-business-application.aspx"&gt;pattern Office Business Application (OBA)&lt;/A&gt; ,&amp;nbsp; è rappresentato dai nuovi servizi messi a disposizione da FedEx e mostrati nella&amp;nbsp; &lt;A href="http://www.microsoft.com/presspass/events/devcon/default.mspx" target=_blank mce_href="http://www.microsoft.com/presspass/events/devcon/default.mspx"&gt;KeyNote della Office Developers Conference&lt;/A&gt; da Bill Gates &lt;/P&gt;
&lt;P align=center&gt;&lt;IMG height=399 src="http://ericbowen.smugmug.com/photos/253392460_hTCXs-M-1.jpg" width=715 mce_src="http://ericbowen.smugmug.com/photos/253392460_hTCXs-M-1.jpg"&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Tra le funzionalità implementate abbiamo:&lt;/P&gt;
&lt;P&gt;- &lt;STRONG&gt;Una nuova applicazione per la gestione integrata con Outlook dei servizi di FedEx&lt;/STRONG&gt;&amp;nbsp; che trovate all'indirizzo &lt;A title=http://www.fedex.com/quickship/ href="http://www.fedex.com/quickship/" target=_blank mce_href="http://www.fedex.com/quickship/"&gt;http://www.fedex.com/quickship/&lt;/A&gt; . L'applicazione si integra completamente con l'interfaccia di Outlook e permette di creare dei profili locali per gli utenti per cui volete gestire servizi di spedizione esposti su Internet da FedEx. Viene&amp;nbsp; mantenuta&amp;nbsp; localmente l'associazione tra servizi e contatti permettendo di gestire l'accesso ai Web Service di Fedex in modo integrato alle risorse locali, il tutto senza abbandonare l'interfaccia di outlook. &lt;/P&gt;
&lt;P&gt;Di seguito vedete alcune schermate:&lt;/P&gt;
&lt;P&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=289 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/6a1f8562d81d_7273/image_6.png" width=449 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/6a1f8562d81d_7273/image_6.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=285 alt=image src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/6a1f8562d81d_7273/image_5.png" width=388 border=0 mce_src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/6a1f8562d81d_7273/image_5.png"&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Vi consiglio di guardare la demo dell'applicazione a&amp;nbsp; &lt;A title=http://www.fedex.com/images/us/quickship/launch.html href="http://www.fedex.com/images/us/quickship/launch.html" target=_blank mce_href="http://www.fedex.com/images/us/quickship/launch.html"&gt;http://www.fedex.com/images/us/quickship/launch.html&lt;/A&gt; . &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;- &lt;STRONG&gt;Prototipo di site template per Office Sharepoint "MyFedEx-style"&lt;/STRONG&gt; ottimo esempio di Software + Service con cui le aziende clienti di FedEx potranno inserire nella propria intranet un area dedicata ai servizi FedEx che va ad interagire direttamente con i Web Service su Internet di FedEx e Windows Live (in particolare le mappe) combinandoli con lo Sharepoint ed i dati locali all'azienda, consentendo la gestione del tracking e delle altre attività di spedizione direttamente dalle pagine della Intranet in modo integrato con i dati aziendali:&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG height=359 alt="FedEx Shipping - sharepoint" src="http://blogs.msdn.com/blogfiles/johnmullinax/WindowsLiveWriter/ScreenshotsfromFedExsdemoduringBillGsODC_DB94/FedEx%20Shipping%20-%20sharepoint_thumb.jpg" width=539 border=0 mce_src="http://blogs.msdn.com/blogfiles/johnmullinax/WindowsLiveWriter/ScreenshotsfromFedExsdemoduringBillGsODC_DB94/FedEx%20Shipping%20-%20sharepoint_thumb.jpg"&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;- &lt;STRONG&gt;Prototipo di stampa per FedEx Kinkos da Office Word 2007&lt;/STRONG&gt;&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG height=368 alt="FedEx Kinkos - Word2007" src="http://blogs.msdn.com/blogfiles/johnmullinax/WindowsLiveWriter/ScreenshotsfromFedExsdemoduringBillGsODC_DB94/FedEx%20Kinkos%20-%20Word2007_thumb.jpg" width=555 border=0 mce_src="http://blogs.msdn.com/blogfiles/johnmullinax/WindowsLiveWriter/ScreenshotsfromFedExsdemoduringBillGsODC_DB94/FedEx%20Kinkos%20-%20Word2007_thumb.jpg"&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;- &lt;STRONG&gt;FedEx per Office Live Small Business&lt;/STRONG&gt;&lt;/P&gt;
&lt;P align=center&gt;&lt;IMG height=285 alt=clip_image001[5] src="http://blogs.msdn.com/blogfiles/johnmullinax/WindowsLiveWriter/ScreenshotsfromFedExsdemoduringBillGsODC_DB94/clip_image001%5B5%5D_thumb.jpg" width=551 border=0 mce_src="http://blogs.msdn.com/blogfiles/johnmullinax/WindowsLiveWriter/ScreenshotsfromFedExsdemoduringBillGsODC_DB94/clip_image001%5B5%5D_thumb.jpg"&gt;&lt;/P&gt;
&lt;P&gt;Informazioni ulteriori per sviluppatori sui servizi messi a disposizione da FedEx le trovate a &lt;A href="http://www.fedex.com/us/developer/product/resources.html" target=_blank mce_href="http://www.fedex.com/us/developer/product/resources.html"&gt;FedEx Developer Resource Center&lt;/A&gt; (DRC).&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7634868" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/SOA/default.aspx">SOA</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/VSTO/default.aspx">VSTO</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></item><item><title>Disponible Hands-on-lab su MSMQ e WCF</title><link>http://blogs.msdn.com/giuseppeguerrasio/archive/2008/02/01/disponible-hands-on-lab-su-msmq-e-wcf.aspx</link><pubDate>Fri, 01 Feb 2008 17:03:02 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7374723</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/giuseppeguerrasio/comments/7374723.aspx</comments><wfw:commentRss>http://blogs.msdn.com/giuseppeguerrasio/commentrss.aspx?PostID=7374723</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/msmqpluswcf"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="166" alt="image" src="http://blogs.msdn.com/blogfiles/giuseppeguerrasio/WindowsLiveWriter/DisponibleHandsonlabsuMSMQeWCF_D067/image_6.png" width="244" align="left" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Disponibile nella code gallery di MSDN un nuovo interessante &lt;a href="http://code.msdn.microsoft.com/msmqpluswcf" target="_blank"&gt;Hands-on-lab dedicato all'integrazione tra MSMQ (Microsoft Message Queuing) e WCF (Windows Communication Foundation)&lt;/a&gt; . &lt;/p&gt; &lt;p&gt;L'integrazione tra le due tecnologie è estremamente interessante e permette di sviluppare solide applicazioni basate su code MSMQ affidabili con il supporto transazionale, utilizzando i principi di base di WCF. Nel materiale oltre al codice ad ad un documento che guida il lab , disponibile anche un &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=msmqpluswcf&amp;amp;DownloadId=302" target="_blank"&gt;video&lt;/a&gt; . &lt;p&gt;. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7374723" 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/SOA/default.aspx">SOA</category><category domain="http://blogs.msdn.com/giuseppeguerrasio/archive/tags/.NET/default.aspx">.NET</category></item></channel></rss>