<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>blogs.ASPItalia.com</title><link>http://blogs.aspitalia.com//ricciolo//</link><description>blogs.ASPItalia.com</description><language>it-it</language><copyright>1998-2012 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Cortana' 2012.5.12</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Wed, 09 Jun 2010 16:13:00 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.aspitalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com//ricciolo//</link></image><item><title>Progress di una chiamata Silverlight ad un servizio</title><link>http://blogs.aspitalia.com/ricciolo/post2639/Progress-Chiamata-Silverlight-Servizio.aspx</link><pubDate>Wed, 09 Jun 2010 16:13:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2639" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Ormai si sa, Silverlight come unico strumento di accesso ad informazioni remote, permette di usare i servizi, siano essi sviluppati lato server in asmx, &lt;b&gt;WCF&lt;/b&gt; o altre tecnologie. Non è propriamente l'unica perché possiamo effettuare chiamate HTTP generiche e tramite REST/POX ottenere sottoforma di Json e XML i dati. Ad ogni modo i servizi usano uno standard e sono molto comodi e facili da utilizzare, grazie alla generazione automatica del proxy.&lt;/p&gt;&lt;p&gt;Durante un corso mi è stato però chiesto se possiamo conoscere lo stato di avanzamento di una chiamata ad un servizio. Partiamo dal presupposto che un servizio non dovrebbe mai restituire una quantità notevole di dati per due principali motivi:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;è una chiamata HTTP, se qualcosa si interrompe siamo costretti a rieffettuare la chiamata e riottenere l'intera risposta;&lt;/li&gt;&lt;li&gt;è probabile che tutti questi dati non servano per intero all'utente fin dall'inizio e una buona politica di frammentazione di download delle informazioni è la strada ideale.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ad ogni modo, un servizio che restituisce 1/5MB può essere accettabile e l'ideale sarebbe fornire lo stato di avanzamento all'utente. Per capire come conoscere lo stato di avanzamento dobbiamo prima di tutto sapere che sia Silverlight, lato client, che WCF, lato server, bufferizzano la richiesta e la risposta. Questo significa che entrambi preparano il messaggio &lt;b&gt;SOAP&lt;/b&gt;, lo serializzano e lo mandano in risposta, o viceversa, leggono i byte della richiesta/risposta e solo quando interamente caricata preparano il messaggio e lo interpretano.&lt;/p&gt;&lt;p&gt;Poiché a noi interessa l'aspetto Silverlight dobbiamo prima di tutto modificare nel file &lt;b&gt;ServiceReferences.ClientConfig&lt;/b&gt; l'attributo transferMode:&lt;/p&gt;&lt;div class="codebox"&gt;&lt;pre&gt;&lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;basichttpbinding&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;binding&lt;/span&gt; &lt;span style="color:#FF0000"&gt;transfermode&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;StreamedResponse&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;binding&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/basichttpbinding&gt;&lt;p&gt;In questo modo il binding HTTP di Silverlight comincerà a leggere la risposta pian piano che i byte giungono dal server. Questo però non basta perché non abbiamo cognizione dell'avanzamento della lettura della risposta. In Silverlight 4.0 possiamo scrivere behavior, binding e inserire message inspector, tutte cose ereditate da WCF del .NET Framework, ma non possiamo riscrivere parzialmente il &lt;b&gt;basicHttpBinding&lt;/b&gt; e in generale &lt;b&gt;HttpChannelFactory&lt;/b&gt;. Fortunatamente questo oggetto sfrutta al suo interno, per effettuare fisicamente la chiamata HTTP, la classe &lt;b&gt;HttpWebRequest&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Per conoscere lo stato di avanzamento possiamo quindi personalizzare il modo in cui l'HttpWebRequest viene creato. Per farlo nel .NET Framework, ma anche in Silverlight, abbiamo a disposizione il metodo statico &lt;b&gt;WebRequest.RegisterPrefix&lt;/b&gt; per indicare, in base allo schema, quale &lt;b&gt;IWebRequestCreate&lt;/b&gt; utilizzare. Normalmente possiamo scegliere tra &lt;b&gt;WebRequestCreator.BrowserHttp&lt;/b&gt; e &lt;b&gt;WebRequestCreator.ClientHttp&lt;/b&gt;. Il primo sfrutta lo stesso motore del browser e contiene quindi i cookie del dominio e permette al browser di leggere la risposta, mentre il secondo scavalca il browser e permette di effettuare chiamate HTTP in liberà.&lt;/p&gt;&lt;p&gt;L'idea è quindi di creare un IWebRequestCreate e relativi HttpWebRequest, HttpWebResponse e Stream personalizzati che mi permettano di sapere a che punto si trova la lettura dello Stream. Quando infatti impostiamo il transferMode a streamed viene impostato sull'oggetto HttpWebRequest la proprietà &lt;b&gt;AllowReadStreamBuffering&lt;/b&gt; a false, permettendo la lettura dello Stream mentre riceviamo i byte.&lt;/p&gt;&lt;p&gt;Per andare al sodo, &lt;a href="http://www.cristiancivera.com/Downloads/wcfprogress.zip"&gt;qua &lt;/a&gt;trovate un'applicazione di esempio. Prima di tutto registro il mio creator personalizzato:&lt;/p&gt;&lt;div class="codebox"&gt;&lt;pre&gt;WebRequest.RegisterPrefix(&amp;quot;&lt;span style="color:#8B0000"&gt;http://&lt;/span&gt;&amp;quot;, AdvancedWebRequestCreator.Default);&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tramite esso posso poi intercettare l'evento che mi notifica lo stato di avanzamento di una chiamata.&lt;/p&gt;&lt;div class="codebox"&gt;&lt;pre&gt;AdvancedWebRequestCreator.Default.UriProgressChanged += &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; EventHandler&amp;lt;UriProgressChangedEventArgs&amp;gt;(Default_UriProgressChanged);&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;Nell'evento so l'URI del servizio che sto chiamando, la percentuale, i byte scaricati e totali. Ho anche aggiunto una proprietà per indicare, per ogni URI, quale creator utilizzare, utile per quando usiamo i due client (http e browser) in modo misto.&lt;/p&gt;&lt;div class="codebox"&gt;&lt;pre&gt;AdvancedWebRequestCreator.Default.Mappings.Add(&lt;span style="color:#0000FF"&gt;new&lt;/span&gt; UriCreateMapping(&lt;span style="color:#0000FF"&gt;new&lt;/span&gt; Uri(&amp;quot;&lt;span style="color:#8B0000"&gt;http://sito.it&lt;/span&gt;&amp;quot;), WebRequestCreator.ClientHttp));&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per il resto basta chiamare il servizio come normalmente facciamo. Un'ultima nota per quanto riguarda WCF lato server: il transferMode dev'essere obbligatoriamente su buffered altrimenti la risposta non conterrà il &lt;b&gt;ContentLength&lt;/b&gt; ed è impossibile per noi indicare lo stato.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Web_Service/" rel="tag"&gt;Web Service&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Communication_Foundation/" rel="tag"&gt;Windows Communication Foundation&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/ricciolo/post2639/Progress-Chiamata-Silverlight-Servizio.aspx"&gt;&lt;em&gt;Progress di una chiamata Silverlight ad un servizio&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian &amp;quot;Ricciolo&amp;quot; Civera</dc:creator><category>Silverlight, .NET Framework 3.0, Web Service, Windows Communication Foundation, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2639/Progress-Chiamata-Silverlight-Servizio.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2639/Progress-Chiamata-Silverlight-Servizio.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2639.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2639</trackback:ping></item><item><title>Silverlight - Real time audio peak meter </title><link>http://blogs.aspitalia.com/ricciolo/post2511/Silverlight-Real-Time-Audio-Peak-Meter.aspx</link><pubDate>Sun, 31 May 2009 09:14:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2511" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In un &lt;a href="http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx"&gt;post&lt;/a&gt; precedente ho mostrato di come si può realizzare un misuratore di picchi per l'audio di un &lt;b&gt;MediaElement&lt;/b&gt; precalcolandoli con un'applicazione console. Ovviamente questa non è la prassi normale di tutti i lettori normali, dove il calcolo della FFT applicata ai samples avviene in real time, man mano che questi vengono renderizzati sulla periferica audio.&lt;/p&gt;&lt;p&gt;Da Silverlight 2.0 sull'oggetto MediaElement&amp;#xa0;è presente un metodo SetSource che accetta uno Stream oppure un'oggetto &lt;b&gt;MediaStreamSource&lt;/b&gt;. Questa classe ha dei metodi che MediaElement chiama, come OpenMediaAsync, GetSampleAsync, SeekAsync per chiederci di aprire la sorgente, di restituirgli gruppi di samples o di posizionarci ad uno specifico timestamp. Con i metodi ReportOpenMediaCompleted, ReportGetSampleCompleted e ReportSeekCompleted non si fa altro che notificargli l'avvenuta operazione e ciclicamente mandargli pacchetti audio/video.&lt;/p&gt;&lt;p&gt;La brutta notizia è che i samples audio e video devono essere compressi (MP4, WMV) e quindi quello che noi possiamo fare è solo fare da tramite per fonire tracce audio e video con i protocolli che vogliamo: RTP, UPNP, streaming custom. Questa è una brutta notizia perché per applicare la FFT occorre avere i samples grezzi, già decodificati. L'oggetto MediaElement non permette di caricare file &lt;b&gt;WAV&lt;/b&gt; direttamente, ma il MediaStreamSouce permette invece di passare anche i samples raw, che il file WAV appunto contiene. Sebbene si potrebbe scrivere un decoder MP3, non sono così pazzo da farlo :-), perciò ho scelto di creare un file &lt;b&gt;WavMediaStreamSource&lt;/b&gt; che carica tramite WebRequest un file wav e&amp;#xa0;legge&amp;#xa0;l'header per conoscere il numero di canali, i samples al secondo (solitamente 44100) e i bit (8/16). L'implementazione poi non fa altro che rigirare i byte al MediaElement.&lt;/p&gt;&lt;p&gt;Ho portato poi l'algoritmo FFT e di calcolo dei picchi sulla mia libreria Silverlight e diviso il controllo del post precedente in due parti: &lt;b&gt;DataAudioPeakMeter&lt;/b&gt; e &lt;b&gt;SamplesAudioPeakMeter&lt;/b&gt;. Il primo lavora con il file dat precalcolato e funziona con tutti i formati supportati da SL. Il secondo lavora solo con i file WAV, ma funziona in real time. Entrambi poi fanno uso della &lt;b&gt;BarVisualization&lt;/b&gt; per l'animazione.&lt;/p&gt;&lt;p&gt;L'utilizzo è piuttosto semplice:&lt;/p&gt;
&lt;div class="codebox"&gt;&lt;pre&gt;&lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;MediaElement&lt;/span&gt; &lt;span style="color:#FF0000"&gt;AutoPlay&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;False&amp;quot;&lt;/span&gt;
              &lt;span style="color:#FF0000"&gt;x&lt;/span&gt;:&lt;span style="color:#FF0000"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;media&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF"&gt;/&amp;gt;&lt;/span&gt;

&lt;span style="color:#008000"&gt;&amp;lt;!-- Visualization --&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;SamplesAudioPeakMeter&lt;/span&gt; &lt;span style="color:#FF0000"&gt;x&lt;/span&gt;:&lt;span style="color:#FF0000"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;sa&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;BarVisualization&lt;/span&gt; &lt;span style="color:#FF0000"&gt;BarSegmentHeight&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;4&amp;quot;&lt;/span&gt;
        &lt;span style="color:#FF0000"&gt;BarMargin&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
        &lt;span style="color:#FF0000"&gt;BarSegmentMargin&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
        &lt;span style="color:#FF0000"&gt;StrokeBrush&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Yellow&amp;quot;&lt;/span&gt;
        &lt;span style="color:#FF0000"&gt;StrokeThickness&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;BarVisualization.BarBrush&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;LinearGradientBrush&lt;/span&gt; &lt;span style="color:#FF0000"&gt;StartPoint&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;0,0&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000"&gt;EndPoint&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;0,1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
                &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;GradientStop&lt;/span&gt; &lt;span style="color:#FF0000"&gt;Offset&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
                              &lt;span style="color:#FF0000"&gt;Color&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Black&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;GradientStop&lt;/span&gt; &lt;span style="color:#FF0000"&gt;Offset&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;
                              &lt;span style="color:#FF0000"&gt;Color&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF"&gt;/&amp;gt;&lt;/span&gt;

            &lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;LinearGradientBrush&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;BarVisualization.BarBrush&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;BarVisualization&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;SamplesAudioPeakMeter&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Da codice poi dobbiamo legare la sorgente wav sia al MediaElement che al SamplesAudioPeakMeter:&lt;/p&gt;
&lt;div class="codebox"&gt;&lt;pre&gt;WavMediaStreamSource source = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; WavMediaStreamSource(&lt;span style="color:#0000FF"&gt;new&lt;/span&gt; Uri(&amp;quot;&lt;span style="color:#8B0000"&gt;test1.wav&lt;/span&gt;&amp;quot;, UriKind.RelativeOrAbsolute));
source.Loop = &lt;span style="color:#0000FF"&gt;true&lt;/span&gt;;

&lt;span style="color:#008000"&gt;// Binding Source -&amp;gt; Visualization&lt;/span&gt;
sa.SetSource(source);
&lt;span style="color:#008000"&gt;// Binding Source -&amp;gt; MediaElement&lt;/span&gt;
media.SetSource(source);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ed ecco il risultato:&lt;/p&gt;
&lt;img src="http://blogs.aspitalia.com/img/Ricciolo/fft.png" /&gt;
&lt;p&gt;Ovviamente i file wav sono di grandi dimensioni quindi questa tecnica è adatta per file di piccola di dimensione sulla quale fare loop, ma meglio di niente :-). Poi speriamo che magari nella RTM di Silverlight 3.0 ci sia la possibilità di accedere ai samples già decodificati.&lt;/p&gt;
&lt;p&gt;Infine le performance: escludendo l'animazione sono rimasto piuttosto colpito. La mia CPU resta su un 2% per calcolare FFT e picchi. Includendo l'animazione si arriva poi ad un 25/30%, ma va considerato che SL tenta sempre di andare al massimo di frame rate per l'esecuzione delle animazioni.&lt;br/&gt;Presto metterò i sorgenti: promesso!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_-_animazioni/" rel="tag"&gt;Silverlight - animazioni&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_2.0/" rel="tag"&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/ricciolo/post2511/Silverlight-Real-Time-Audio-Peak-Meter.aspx"&gt;&lt;em&gt;Silverlight - Real time audio peak meter &lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian &amp;quot;Ricciolo&amp;quot; Civera</dc:creator><category>Silverlight, Silverlight - animazioni, Silverlight 2.0, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2511/Silverlight-Real-Time-Audio-Peak-Meter.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2511/Silverlight-Real-Time-Audio-Peak-Meter.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2511.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2511</trackback:ping></item><item><title>Salvare immagini Bitmap con Silverlight 3.0</title><link>http://blogs.aspitalia.com/ricciolo/post2510/Salvare-Immagini-Bitmap-Silverlight-3.0.aspx</link><pubDate>Fri, 29 May 2009 17:56:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2510" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In &lt;strong&gt;Silverlight 3.0&lt;/strong&gt; è stato aggiunta la possibilità di salvare file in locale attraverso la &lt;strong&gt;SaveFileDialog&lt;/strong&gt;. Per motivi di sicurezza, questa può essere visualizzata solo all'interno di un evento scatenato dall'utente (pressione del pulsante, ecc)&amp;#xa0;mentre attraverso OpenFile è possibile poi aprire uno Stream per la scrittura sulla quale è possibile scrivere qualsiasi cosa.&lt;/p&gt;&lt;p&gt;In una discussione con &lt;a href="http://blogs.aspitalia.com/nostromo/"&gt;Marco&lt;/a&gt; ci è venuto il dubbio se si poteva salvare immagini in locale, ma purtroppo la cosa non è molto semplice da raggiungere. In SL infatti non ci sono API per effettuare encoding ed decoding di immagini ad eccezione del passare uno Stream da visualizzare. Inoltre con &lt;strong&gt;WriteableBitmap&lt;/strong&gt; è stata aggiunta la possibilità di caricare uno Stream o di renderizzare un &lt;strong&gt;UIElement&lt;/strong&gt; su un'immagine, ma poi non è possibile accedere ai byte. Insomma, se si ha un'immagine già codificata in JPEG/PNG basta semplicemente travasare lo Stream sorgente verso il file locale, altrimenti se si ha solo i byte grezzi dell'immagine occorre scriversi il motore di encoding e di creazione del contenitore.&lt;/p&gt;&lt;p&gt;Per fortuna c'è il buon vecchio file &lt;strong&gt;BMP&lt;/strong&gt;, la cui definizione si può trovare &lt;a href="http://en.wikipedia.org/wiki/BMP_file_format"&gt;qui&lt;/a&gt;, che è abbastanza semplice da creare&amp;#xa0;e a parte dover accodare i byte dell'immagine dal basso verso l'altro, non necessita di algoritmi di compressione. Ovviamente il file risultante è di grandi dimensioni, ma non dev'essere trasportato in rete, ma bensì salvato direttamente in locale. Ho scritto quindi un &lt;strong&gt;BitmapEncoder&lt;/strong&gt; e un BitmapFrame per salvare un'immagine in BMP, lo trovate completo di sorgente &lt;a href="http://lab.aspitalia.com/Ricciolo/Downloads/SLSaveBitmap.zip"&gt;qua&lt;/a&gt;. L'esempio allegato genera un'immagine con un algoritmo e la mostra anche attraverso un WriteableBitmap.&lt;/p&gt;&lt;p&gt;&lt;img align="baseline" src="http://blogs.aspitalia.com/img/Ricciolo/SLBitmap.jpg" border="0" hspace="0" complete="true" complete="true" /&gt;&lt;/p&gt;&lt;p&gt;Purtroppo non serve a tantissimo, perché attualmente la WriteableBitmap non permette di accedere ai pixel e quindi non è possibile salvare screenshot effettuati sugli elementi. Potenzialmente si può creare qualsiasi file, ma ovviamente non è semplice doversi riscrivere librerie di creazione di file, non potendosi appoggiare a oggetti COM.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_3.0/" rel="tag"&gt;Silverlight 3.0&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/ricciolo/post2510/Salvare-Immagini-Bitmap-Silverlight-3.0.aspx"&gt;&lt;em&gt;Salvare immagini Bitmap con Silverlight 3.0&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian &amp;quot;Ricciolo&amp;quot; Civera</dc:creator><category>Silverlight, XAML, Silverlight 3.0</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2510/Salvare-Immagini-Bitmap-Silverlight-3.0.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2510/Salvare-Immagini-Bitmap-Silverlight-3.0.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2510.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2510</trackback:ping></item><item><title>Silverlight - Audio peak meter</title><link>http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx</link><pubDate>Sat, 23 May 2009 16:59:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2506" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Qualche tempo fa realizzai un &lt;a href="http://blogs.aspitalia.com/ricciolo/post2168/Spettro-Audio-WPF.aspx"&gt;controllo&lt;/a&gt; per l'analisi dello stream audio e la visualizzazione dei picchi attraverso &lt;strong&gt;WPF&lt;/strong&gt;. Nel tempo libero del tempo libero,&amp;#xa0;da appassionato di &lt;strong&gt;DirectShow&lt;/strong&gt; e di fuffologie mi son chiesto se si poteva fare una cosa simile anche in &lt;strong&gt;Silverlight&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Il problema è che in Silverlight non si ha a disposizione DirectShow, non si può usare codice unmanaged ne si può accedere allo stream audio. L'unico oggetto che abbiamo è &lt;strong&gt;MediaElement&lt;/strong&gt; che permette di riprodurre audio e video; nella versione 2.0 c'è la classe &lt;strong&gt;MediaStreamSource&lt;/strong&gt;, ma sebbene non abbia avuto ancora modo di provarla a fondo, permette di accedere allo stream codificato e non quello decodificato, perciò scrivere un decoder mp3 in codice managed non è proprio una passeggiata :-). Per poter applicare FFT e calcolare decibel e picchi dobbiamo infatti avere i byte grezzi, come i file wav.&lt;/p&gt;&lt;p&gt;Siccome per la maggior parte dei casi può bastare un piccolo loop su una canzone ho trovato una facile soluzione: precalcolare. In pratica ho realizzato una console application, interamente managed, che apre un file audio, calcola FFT ecc e salva in un file tutti i byte rappresentativi dei picchi, circa 12 suddivisi per 19 frequenze al secondo.&lt;/p&gt;&lt;p&gt;Una volta che si ha il file audio e il file .dat contenente i picchi, tramite un controllo posso mostrarne i valori. Il controllo &lt;strong&gt;AudioMeter&lt;/strong&gt; ha bisogno del file .dat e&amp;#xa0;del MediaElement sul quale basarsi per mostrare i picchi in funzione della posizione. Ecco il risultato:&lt;/p&gt;&lt;object width="480" height="385"&gt;&lt;embed width="480" height="385" src="http://www.youtube.com/v/ZavzJg4NK0Y&amp;hl=it&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always"&gt;&lt;/embed&gt;&lt;/embed&gt;&lt;//embed&gt;&lt;/embed&gt;&lt;//embed&gt;&lt;/&gt;&lt;//&gt;&lt;/embed&gt;&lt;//embed&gt;&lt;/&gt;&lt;//&gt;&lt;/&gt;&lt;//&gt;&lt;/&gt;&lt;//&gt;&lt;/object&gt;&lt;p&gt;Per rendere il più fluido possibile l'animazione intercetto &lt;strong&gt;CompositionTarget.Rendering&lt;/strong&gt; che viene scatenato ad ogni frame dell'applicazione Silverlight che viene renderizzato. Le barre che vanno su e giù sono invece animate da &lt;strong&gt;DoubleAnimation&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Devo dire che sono molto soddisfatto del risultato. Anche se&amp;#xa0;il video non rende moltissimo, l'animazione è molto fluida e ben sincronizzata, meglio di quanto avevo fatto con WPF.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_-_animazioni/" rel="tag"&gt;Silverlight - animazioni&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_2.0/" rel="tag"&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_3.0/" rel="tag"&gt;Silverlight 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx"&gt;&lt;em&gt;Silverlight - Audio peak meter&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian &amp;quot;Ricciolo&amp;quot; Civera</dc:creator><category>Silverlight, Silverlight - animazioni, Silverlight 2.0, Silverlight 3.0, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2506.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2506</trackback:ping></item><item><title>Mostrare la WebCam in Silverlight</title><link>http://blogs.aspitalia.com/ricciolo/post2492/Mostrare-WebCam-Silverlight.aspx</link><pubDate>Thu, 07 May 2009 11:00:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2492" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Nel &lt;a href="http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx"&gt;precedente post&lt;/a&gt; ho illustrato la mia idea di dialogo tra Silverlight e la macchina host, ma ora vediamo un caso pratico.&lt;/p&gt;
&lt;p&gt;Prima di tutto ho preparato un&amp;#39;applicazione Windows senza finestre, ma che rimane sulla system tray mettendosi in ascolto come policy server e su un&amp;#39;altra porta in attesa di connessioni. Questo &amp;quot;server&amp;quot; alla prima connessione avvia un filtro &lt;b&gt;DirectShow&lt;/b&gt; che prende l&amp;#39;immagine della WebCam, prende ogni frame attraverso un &lt;b&gt;Sample Grabber&lt;/b&gt; e lo comprime in Jpeg ad una qualità non troppo impegnativa. I bytes risultati vengono inviati al client preceduti da 8 byte che indicano la dimensione dell&amp;#39;immagine e quindi dei bytes che il client si deve aspettare. Ciò che ottengo quindi è di fatto un &lt;b&gt;Motion Jpeg&lt;/b&gt; pià alcuni controlli che il server fa per saltare frame qualora il client sia in ritardo a ricevere i fotogrammi.&lt;/p&gt;
&lt;p&gt;Il client Silverlight invece avvia la connessione e in modo ciclico legge nel buffer i primi 8 byte per conoscere la dimensione dell&amp;#39;immagine. Carica i restanti byte con i quale crea un &lt;b&gt;MemoryStream&lt;/b&gt; che dà poi in pasto al metodo &lt;b&gt;BitmapImage.SetSource&lt;/b&gt;. Quest&amp;#39;ultimo carica l&amp;#39;immagine che viene poi associata ad un oggetto &lt;b&gt;Image&lt;/b&gt; di Silverlight. In pratica quindi, vi è un flusso continuo di bytes di immagini compresse che vengono poi ricostruite per formare i fotogrammi dell&amp;#39;immagine con il quale poi ci si può sbizzarrire come si vuole.&lt;/p&gt;
&lt;p&gt;Ho creato poi un deployment con &lt;b&gt;ClickOnce&lt;/b&gt; per avviare il server automaticamente e dei byte &amp;quot;magici&amp;quot; che manda il client per chiudere il server. Questo il risultato finale:&lt;/p&gt;
&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/t1u9G8myG9Y&amp;hl=it&amp;fs=1&amp;rel=0&amp;color1=0x2b405b&amp;color2=0x6b8ab6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/t1u9G8myG9Y&amp;hl=it&amp;fs=1&amp;rel=0&amp;color1=0x2b405b&amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;p&gt;Silverlight con questa tecnica si comporta bene e l&amp;#39;uso della CPU è non è intenso, garantendo sempre un flusso fluido dell&amp;#39;immagine.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_2.0/" rel="tag"&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_7/" rel="tag"&gt;Windows 7&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Client/" rel="tag"&gt;Windows Client&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/ricciolo/post2492/Mostrare-WebCam-Silverlight.aspx"&gt;&lt;em&gt;Mostrare la WebCam in Silverlight&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian &amp;quot;Ricciolo&amp;quot; Civera</dc:creator><category>Silverlight, .NET Framework, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, Silverlight 2.0, Windows 7, Windows Client, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2492/Mostrare-WebCam-Silverlight.aspx</guid><slash:comments>4</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2492/Mostrare-WebCam-Silverlight.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2492.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2492</trackback:ping></item><item><title>Comunicazione TCP tra Silverlight e WPF</title><link>http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx</link><pubDate>Wed, 06 May 2009 21:46:00 GMT</pubDate><description>&lt;img src="http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2491" border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Negli ultimi giorni mi sono incuriosito su come risolvere un'esigenza che potrebbe capitarmi in futuro: la comunicazione tra &lt;b&gt;Silverlight&lt;/b&gt; e una application &lt;b&gt;WPF/WinForms&lt;/b&gt;.&lt;br /&gt;Silverlight ha potenzialità limitate e potrebbe utile usare un&amp;#39;applicazione classica locale che non ha limiti in termini di funzionalità.&lt;/p&gt;
&lt;p&gt;Per questo scopo in Silverlight fortunatamente hanno lasciato la classe &lt;b&gt;Socket&lt;/b&gt; che, sebbene il suo utilizzo differisce dal .NET Framework, permette di connettersi ad un end point e dialogare direttamente con i bytes, permettendo ampio margine di movimento e consentendo di implementare protocolli standard o custom.&lt;/p&gt;
&lt;p&gt;Con questo post non è mio intento spiegare in dettaglio come si usa il socket, ma illustrare come vedo io una possibile implementazione e una collaborazione tra un&amp;#39;applicazione locale e una in Silverlight. Innanzitutto bisogna tenere conto che Silverlight può connettersi solo al range di porte &lt;b&gt;4502-4534&lt;/b&gt;, per ovvi motivi di sicurezza: evitare che un&amp;#39;applicazione possa essere strumento di attacchi &lt;b&gt;DoS&lt;/b&gt; o &lt;b&gt;Reverse tunnel&lt;/b&gt;. Inoltre sia che ci si connetta al host di origine sia ad un host esterno (cross site), è necessario che il server sia in ascolto anche sulla porta &lt;b&gt;943&lt;/b&gt; (fissa) che su richiesta deve restituire il file &lt;i&gt;clientAccessPolicy.xml&lt;/i&gt; che già conosciamo per le richieste HTTP, ma che viene validato anche per le richieste socket.&lt;br /&gt;A &lt;a href="http://msdn.microsoft.com/en-gb/library/cc645032(VS.95).aspx#sectionToggle4"&gt;questo indirizzo&lt;/a&gt; troviamo un esempio di classe PolicyServer per implementare questa logica di validazione, qualora un client Silverlight la richieda.&lt;/p&gt;
&lt;p&gt;Con l&amp;#39;esempio indicato possiamo anche vedere come con il pattern Begin/End possiamo accettare nuove connessioni, inviare e ricevere bytes e creare di fatto un nostro protocollo di dialogo. Infatti l&amp;#39;idea è che una volta avviata l&amp;#39;applicazione Silverlight, qualora serva, facciamo partire quella locale che si mette in ascolto e con la quale poi si instaura un dialogo per chiedere informazioni al server o viceversa.&lt;/p&gt;
&lt;p&gt;Per far partire il server viene in aiuto &lt;b&gt;ClickOnce&lt;/b&gt; che grazie al sua capacità di installare un&amp;#39;applicazione al volo, la fa anche avviare. Basta navigare aprendo una popup al file .application e l&amp;#39;applicazione viene installata, previa conferma, e poi avviata.&lt;/p&gt;
&lt;div class="codebox"&gt;&lt;pre&gt;&lt;span style="color:#0000FF"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF"&gt;void&lt;/span&gt; StartButton_Click(&lt;span style="color:#0000FF"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    &lt;span style="color:#008000"&gt;// Avvio l&amp;#39;applicazione con ClickOnce&lt;/span&gt;
    Uri appUri = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; Uri(&amp;quot;&lt;span style="color:#8B0000"&gt;http://test.aspitalia.com:50658/setup/WebCamStreaming.application&lt;/span&gt;&amp;quot;);
    HtmlPage.PopupWindow(appUri, &amp;quot;&lt;span style="color:#8B0000"&gt;_blank&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; HtmlPopupWindowOptions());

    &lt;span style="color:#008000"&gt;// Avvia la comunicazione TCP&lt;/span&gt;
    client.ConnectAsync();
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Attraverso poi un Mutex si può impedire che più istanze partano, lasciando sempre un solo server attivo. Qualora poi non serva più, possiamo sfruttare sempre la connessione tcp per inviare un segnale di chiusura dell&amp;#39;applicazione.&lt;/p&gt;
&lt;p&gt;Nel prossimo post mostrerò un esempio completo di tutto questo ambaradam di cui darò i sorgenti.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_2.0/" rel="tag"&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Continua a leggere &lt;a href="http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx"&gt;&lt;em&gt;Comunicazione TCP tra Silverlight e WPF&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2012 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian &amp;quot;Ricciolo&amp;quot; Civera</dc:creator><category>Silverlight, .NET Framework, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, Silverlight 2.0, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2491.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2491</trackback:ping></item></channel></rss>
