<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Il blog di Pietro Libro</title>
        <link>http://blogs.ugidotnet.org/PietroLibroBlog/Default.aspx</link>
        <description />
        <language>it-IT</language>
        <copyright>Pietro Libro</copyright>
        <managingEditor>pietro.libro@libero.it</managingEditor>
        <generator>Subtext Version 2.1.0.3</generator>
        <image>
            <title>Il blog di Pietro Libro</title>
            <url>http://blogs.ugidotnet.org/images/RSS2Image.gif</url>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Enterprise Library 6</title>
            <category>.Net Framework 4.5</category>
            <category>.Net Framework 4.0</category>
            <category>Varie ed eventuali</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/04/26/enterprise-library-6.aspx</link>
            <description>&lt;p&gt;Nuova release per Microsoft Enterprise Library. Tutti i dettagli del caso &lt;a href="http://msdn.microsoft.com/en-us/library/dn169621.aspx#sec8" target="_blank"&gt;qui.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101525.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/04/26/enterprise-library-6.aspx</guid>
            <pubDate>Fri, 26 Apr 2013 11:09:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/04/26/enterprise-library-6.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101525.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101525.aspx</trackback:ping>
        </item>
        <item>
            <title>Le (mie) prime Windows 8 App Store</title>
            <category>C#</category>
            <category>.Net Framework 4.5</category>
            <category>Windows 8</category>
            <category>Varie ed eventuali</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/04/24/le-mie-prime-windows-8-app-store.aspx</link>
            <description>&lt;p&gt;Alla fine, sono riuscito a pubblicare le mie  prime 4 applicazioni nello Store di Windows 8. L’obiettivo è raddopiare il numero entro la fine di maggio. Se avete voglia di provarle (sono tutte free) e indicarmi qualche suggerimento per le versioni future ed attuali, di seguito  link e nomi :&lt;/p&gt;  &lt;p&gt;&lt;img title="Lazio: Cultura e Turismo" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="132780[2]" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/LeprimeAppdiWindows8Store_7C3E/132780%5B2%5D_thumb_1.png" width="54" height="54" /&gt; &lt;a href="http://apps.microsoft.com/windows/app/lazio-cultura-e-turismo/22017e70-f81f-4fd4-89c9-e6ab0cc45f6c" target="_blank"&gt;Lazio: Cultura e Turismo&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;L'applicazione "Lazio: Cultura e Turismo", è un elenco dei Punti d'Interesse (POI) Culturali del Lazio: Musei, Statue, Monasteri, Dipinti, Abbazie, Castelli, Torri ecc....Per ogni POI è presente una descrizione in Italiano (eventualmente in Inglese), foto e geolocalizzazione. Il catalogo dati è mantenuto e fornito da "Lazio futouring", sito internet: &lt;a href="http://www.futouring.eu" target="_blank"&gt;http://www.futouring.eu.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;img title="Farmacie Italiane" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="128786[1]" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/LeprimeAppdiWindows8Store_7C3E/128786%5B1%5D_6d53c596-3c82-4b54-a4bd-66f9f16a9511.png" width="54" height="54" /&gt; &lt;a href="http://apps.microsoft.com/windows/app/farmacie-italiane/493f771f-fb97-49c3-b970-7413e9daa6a0" target="_blank"&gt;Farmacie Italiane&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Elenco completo delle farmacie italiane aperte al pubblico, comprensivo di dati di localizzazione e geoloclalizzazione. I dati sono mantenuti e forniti tramite piattaforma"cloud" del "Ministero della Salute".&lt;/em&gt; &lt;/p&gt;  &lt;p&gt;&lt;img title="Istituti Scolastici Provincia di Roma" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="123924[1]" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/LeprimeAppdiWindows8Store_7C3E/123924%5B1%5D_a20b31c4-a9ef-4023-a59a-303041b9ab06.png" width="54" height="54" /&gt;&lt;a href="http://apps.microsoft.com/windows/app/istituti-scolastici-provincia-di/c08b0a24-0f93-4e05-8c2a-6a86b9b1af20" target="_blank"&gt;&lt;/a&gt;&lt;a href="http://apps.microsoft.com/windows/app/istituti-scolastici-provincia-di/c08b0a24-0f93-4e05-8c2a-6a86b9b1af20" target="_blank"&gt;Istituti Scolastici Provincia di Roma&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;"Istituti Scolastici Provincia di Roma" Catalogo con geolocalizzazione degli istituti scolastici (superiori) della provincia di Roma. I dati base sono forniti dalla piattaforma "Open Data".&lt;/em&gt; &lt;/p&gt;  &lt;p&gt;&lt;img title="Roma ProvinciaWiFi" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="123362[1]" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/LeprimeAppdiWindows8Store_7C3E/123362%5B1%5D_thumb_1.png" width="54" height="54" /&gt;&lt;a href="http://apps.microsoft.com/windows/app/roma-provinciawifi/ed103394-e36d-4041-b8c0-0c80af20906d" target="_blank"&gt;Roma ProvinciaWiFi&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Individua facilmente apparati WiFi della provincia di Roma per l'accesso gratuito ad Internet. I dati di geolocalizzazione sono ottenuti tramite il "Portale Opendata della Provincia di Roma".&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Buon divertimento :-D.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101520.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/04/24/le-mie-prime-windows-8-app-store.aspx</guid>
            <pubDate>Wed, 24 Apr 2013 06:58:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/04/24/le-mie-prime-windows-8-app-store.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101520.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101520.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET Web Api a Codemotion Roma 2013</title>
            <category>.Net Framework 4.5</category>
            <category>ASP.NET</category>
            <category>C#</category>
            <category>.Net Framework 4.0</category>
            <category>Varie ed eventuali</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/03/22/asp.net-web-api-a-codemotion-roma-2013.aspx</link>
            <description>&lt;p&gt;Se domani non avete proprio nulla da fare :-) possiamo vederci a Codemotion 2013 Roma.&lt;/p&gt;  &lt;p&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETWebApiaCodemotionRoma2013_106C0/image_2.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETWebApiaCodemotionRoma2013_106C0/image_thumb.png" width="437" height="228" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Una sessione introduttiva all’utilizzo del Framework ASP.NET Web Api per lo sviluppo di applicazioni RESTful.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101485.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/03/22/asp.net-web-api-a-codemotion-roma-2013.aspx</guid>
            <pubDate>Fri, 22 Mar 2013 17:39:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/03/22/asp.net-web-api-a-codemotion-roma-2013.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101485.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101485.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET and Web Tools 2012.2  : Web Api Help Page</title>
            <category>.Net Framework 4.5</category>
            <category>.Net Framework 4.0</category>
            <category>ASP.NET</category>
            <category>C#</category>
            <category>ASP.NET Web Api</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/03/09/asp.net-and-web-tools-2012.2-web-api-page.aspx</link>
            <description>&lt;p&gt;Con il rilascio dell’&lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/02/20/asp.net-and-web-tools-2012.2-update.aspx" target="_blank"&gt;aggiornamento ASP.NET 2012.2&lt;/a&gt; di qualche settimana fa,  lo sviluppo di una “Help Page” per Web Api, utilizzando l’apposito &lt;em&gt;Package&lt;/em&gt; di NuGet, é un’attività che impegna meno di 5 minuti (per completezza di informazione, era già presente una versione alpha del &lt;em&gt;Package&lt;/em&gt; prima del rilascio ufficiale).&lt;/p&gt;
&lt;p&gt;1) Dalle “references” del progetto Web da “documentare”, apriamo la finestra per la gestione dei “Packages” di NuGet:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_2.png"&gt;&lt;img width="244" height="111" border="0" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;2) Cerchiamo la voce “Web Api Help Page” e clicchiamo su “Install” (verranno installate le dipendenze necessarie):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_4.png"&gt;&lt;img width="244" height="175" border="0" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_thumb_1.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;3) Al progetto verrà aggiunta l’area “HelpPage” sotto la cartella “Areas”, con tutte le classi necessarie (&lt;em&gt;css&lt;/em&gt; compreso):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_6.png"&gt;&lt;img width="244" height="175" border="0" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_thumb_2.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;4) La classe &lt;em&gt;XmlDocumentationProvider  &lt;/em&gt;che&lt;em&gt; &lt;/em&gt;implementa l’interfaccia &lt;em&gt;IDocumentationProvider&lt;/em&gt; permette di documentare le nostre API nel caso più semplice utilizzando i commenti che decorano le Web API direttamente nel codice (implementando l’interfaccia &lt;em&gt;IDocumentationProvider &lt;/em&gt;é possibile personalizzare questo comportamento).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_8.png"&gt;&lt;img width="244" height="69" border="0" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_thumb_3.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;5) Aggiungiamo nel &lt;em&gt;Global.asax.cs&lt;/em&gt; la riga di codice seguente:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;config.Services.Replace(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(IDocumentationProvider), &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocumentationProvider(HttpContext.Current.Server.MapPath(&lt;span class="str"&gt;"~/App_Data/file.xml"&lt;/span&gt;)));&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;6) A questo punto non ci resta che eseguire la nostra applicazione e digitare “Help” nella barra degli indirizzi:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_10.png"&gt;&lt;img width="244" height="126" border="0" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_thumb_4.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;A questo punto é sufficiente passare alle personalizzazioni del caso :-).&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101466.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/03/09/asp.net-and-web-tools-2012.2-web-api-page.aspx</guid>
            <pubDate>Sat, 09 Mar 2013 12:46:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/03/09/asp.net-and-web-tools-2012.2-web-api-page.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101466.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101466.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET and Web Tools 2012.2 Update</title>
            <category>.Net Framework 4.5</category>
            <category>ASP.NET</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/02/20/asp.net-and-web-tools-2012.2-update.aspx</link>
            <description>&lt;p&gt;Rilasciata la versione finale di “ASP.NET and Web Tools 2012.2 Update”, un download che arrichisce, non di poco, le funzionalità esistenti, in Visual Studio 2012 e ASP.NET (tra le novità, OData EndPoint in ASP.NET Web API, ASP.NET SignalR, Single Page Applications).  Tutti i dettagli del caso sul &lt;a href="http://weblogs.asp.net/scottgu/archive/2013/02/18/announcing-release-of-asp-net-and-web-tools-2012-2-update.aspx" target="_blank"&gt;post originale&lt;/a&gt; sul blog di Scott Guthrie.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101445.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/02/20/asp.net-and-web-tools-2012.2-update.aspx</guid>
            <pubDate>Wed, 20 Feb 2013 07:32:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/02/20/asp.net-and-web-tools-2012.2-update.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101445.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101445.aspx</trackback:ping>
        </item>
        <item>
            <title>Modi diversi di recuperare il numero di messaggi in una coda MSMQ</title>
            <category>C#</category>
            <category>.Net Framework 4.0</category>
            <category>.Net Framework 4.5</category>
            <category>Varie ed eventuali</category>
            <category>WCF</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/01/28/modi-diversi-di-recuperare-il-numero-di-messaggi-in-una.aspx</link>
            <description>&lt;p&gt;Ultimamente mi trovo a lavorare su di un progetto che utilizza WCF e &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Message_Queuing" target="_blank"&gt;MSMQ&lt;/a&gt;. Una delle classiche operazioni quando si lavora con queste tecnologie è sicuramente recuperare il numero di messaggi presenti in una coda. Tra documentazione e ricerche su internet, alla fine si “scopre” che ci sono diversi metodi per risolvere lo stesso problema:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Cursori di MSMQ &lt;/li&gt;    &lt;li&gt;Utilizzo di GetAllMessages &lt;/li&gt;    &lt;li&gt;Utilizzo di GetEnumerator2 &lt;/li&gt;    &lt;li&gt;PowerShell &lt;/li&gt;    &lt;li&gt;Performance Counter &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Traducendo il tutto in righe di codice, per il punto 1) abbiamo:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CountByCursor()
{
    &lt;span class="kwrd"&gt;int&lt;/span&gt; count = 0;
    Cursor cursor = _messageQueue.CreateCursor();
    Message m = CursorPeekWithoutTimeout(cursor, PeekAction.Current);
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (m != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        count = 1;
        &lt;span class="kwrd"&gt;while&lt;/span&gt; ((m = CursorPeekWithoutTimeout(cursor, PeekAction.Next)) != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
            count++;
        }
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (m != &lt;span class="kwrd"&gt;null&lt;/span&gt;) m.Dispose();
    }
    cursor.Dispose();
    &lt;span class="kwrd"&gt;return&lt;/span&gt; count;
}

&lt;span class="kwrd"&gt;private&lt;/span&gt; Message CursorPeekWithoutTimeout(Cursor cursor, PeekAction action)
{
    Message ret = &lt;span class="kwrd"&gt;null&lt;/span&gt;;

    &lt;span class="kwrd"&gt;try&lt;/span&gt;
    {
        ret = _messageQueue.Peek(&lt;span class="kwrd"&gt;new&lt;/span&gt; TimeSpan(1), cursor, action);
    }
    &lt;span class="kwrd"&gt;catch&lt;/span&gt; (MessageQueueException mqe)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (mqe.MessageQueueErrorCode != MessageQueueErrorCode.IOTimeout)
        {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt;;
        }
    }
    &lt;span class="kwrd"&gt;return&lt;/span&gt; ret;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Sinceramente questo è il metodo che più non mi piace, sarà per la parola “Cursore”, sarà per la gestione dell’eccezione, sarà perchè la vedo poco pulita. &lt;/p&gt;

&lt;p&gt;Passiamo al punto 2):&lt;/p&gt;

&lt;pre class="csharpcode"&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CountByGetAllMessages()
{
    &lt;span class="kwrd"&gt;return&lt;/span&gt; _messageQueue.GetAllMessages().Length;
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Semplice e pulita, ma come vedremo a breve, le prestazioni scendono con l’aumentare dei messaggi in coda.&lt;/p&gt;

&lt;p&gt;Punto 3), “GetMessageEnumerator2”:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var x = _messageQueue.GetMessageEnumerator2();
&lt;span class="kwrd"&gt;int&lt;/span&gt; counter = 0;
&lt;span class="kwrd"&gt;while&lt;/span&gt; (x.MoveNext())
{
    counter++;
}
&lt;span class="kwrd"&gt;return&lt;/span&gt; counter;&lt;/pre&gt;

&lt;p&gt;Sfruttiamo il &lt;em&gt;MessageEnumerator&lt;/em&gt; ritornato dal metodo &lt;em&gt;GetEnumerator2&lt;/em&gt; ed iteriamo per spostare il cursore fino alla fine della coda.&lt;/p&gt;

&lt;p&gt;Punto 4), “PowerShell” (in questo caso mi sono limitato a copiare del codice trovato in rete):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;var path = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;@"\\{0}\root\CIMv2"&lt;/span&gt;, machine);

ManagementScope scope;

&lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(username))
{
    scope = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManagementScope(path);
}
&lt;span class="kwrd"&gt;else&lt;/span&gt;
{
    var options = &lt;span class="kwrd"&gt;new&lt;/span&gt; ConnectionOptions { Username = username, Password = password };
    scope = &lt;span class="kwrd"&gt;new&lt;/span&gt; ManagementScope(path, options);
}

scope.Connect();

&lt;span class="kwrd"&gt;if&lt;/span&gt; (queuePath.StartsWith(&lt;span class="str"&gt;".\\")) queuePath = queuePath.Replace("&lt;/span&gt;.\\&lt;span class="str"&gt;", string.Format("&lt;/span&gt;{0}\\&lt;span class="str"&gt;", machine));

string queryString = String.Format("&lt;/span&gt;SELECT * FROM Win32_PerfFormattedData_msmq_MSMQQueue&lt;span class="str"&gt;");
var query = new ObjectQuery(queryString);
var searcher = new ManagementObjectSearcher(scope, query);
IEnumerable&amp;lt;int&amp;gt; messageCountEnumerable =
    from ManagementObject queue in searcher.Get()
    select (int)(UInt64)queue.GetPropertyValue("&lt;/span&gt;MessagesInQueue");
var x = messageCountEnumerable.First();

&lt;span class="kwrd"&gt;return&lt;/span&gt; x;&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;ed infine il punto 5) “Performance Counter”:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;System.Diagnostics.PerformanceCounter backupQueueCounter = &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Diagnostics.PerformanceCounter(
    &lt;span class="str"&gt;"MSMQ Queue"&lt;/span&gt;, &lt;span class="str"&gt;"Messages in Queue"&lt;/span&gt;, &lt;span class="str"&gt;"queue_path"&lt;/span&gt;);

&lt;span class="kwrd"&gt;return&lt;/span&gt; backupQueueCounter.NextValue();&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Bene, ora quale usare ? Proviamo con un piccolo test: ad una coda privata aggiungiamo 10.000 messaggi per volta (all’interno di un ciclo) e proviamo ad utilizzare i metodi su descritti per recuperare il numero di messaggi presenti in coda (si suppone che tra un conteggio e l’altro nella coda non vengano aggiunti altri messaggi). Iteriamo il procedimento per tre volte. &lt;/p&gt;

&lt;p&gt;Di seguito i risultati ottenuti (espressi in millisecondi, per le misure del tempo di esecuzione è stata utilizzata la classe &lt;em&gt;System.Diagnostics.Stopwatcher&lt;/em&gt;):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prima Iterazione&lt;/strong&gt;&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td width="80"&gt;#Msgs&lt;/td&gt;

      &lt;td width="80"&gt;MSMQ Cursor&lt;/td&gt;

      &lt;td width="35"&gt;GetAllMessages&lt;/td&gt;

      &lt;td width="65"&gt;GetEnumerator2&lt;/td&gt;

      &lt;td width="118"&gt;PowerShell&lt;/td&gt;

      &lt;td width="97"&gt;Performance C.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="80"&gt;10.000&lt;/td&gt;

      &lt;td width="80"&gt;449,816&lt;/td&gt;

      &lt;td width="35"&gt;580,703&lt;/td&gt;

      &lt;td&gt;36,37&lt;/td&gt;

      &lt;td&gt;78,543&lt;/td&gt;

      &lt;td&gt;351,86&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="80"&gt;20.000&lt;/td&gt;

      &lt;td width="80"&gt;928,18&lt;/td&gt;

      &lt;td width="35"&gt;1.297,72&lt;/td&gt;

      &lt;td&gt;78,16&lt;/td&gt;

      &lt;td&gt;9,888&lt;/td&gt;

      &lt;td&gt;0,462&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="80"&gt;30.000&lt;/td&gt;

      &lt;td width="80"&gt;1.340,44&lt;/td&gt;

      &lt;td width="35"&gt;1.854,52&lt;/td&gt;

      &lt;td&gt;137,82&lt;/td&gt;

      &lt;td&gt;10,563&lt;/td&gt;

      &lt;td&gt;1,121&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="80"&gt;40.000&lt;/td&gt;

      &lt;td width="80"&gt;1.769,73&lt;/td&gt;

      &lt;td width="35"&gt;2.656,28&lt;/td&gt;

      &lt;td&gt;194,652&lt;/td&gt;

      &lt;td&gt;12,061&lt;/td&gt;

      &lt;td&gt;3,187&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="80"&gt;50.000&lt;/td&gt;

      &lt;td width="80"&gt;2.188,74&lt;/td&gt;

      &lt;td width="35"&gt;3.427,84&lt;/td&gt;

      &lt;td&gt;190,672&lt;/td&gt;

      &lt;td&gt;10,739&lt;/td&gt;

      &lt;td&gt;0,452&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="80"&gt;60.000&lt;/td&gt;

      &lt;td width="80"&gt;2.631,29&lt;/td&gt;

      &lt;td width="35"&gt;3.909,71&lt;/td&gt;

      &lt;td&gt;231,995&lt;/td&gt;

      &lt;td&gt;10,219&lt;/td&gt;

      &lt;td&gt;0,364&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="80"&gt;70.000&lt;/td&gt;

      &lt;td width="80"&gt;3.006,52&lt;/td&gt;

      &lt;td width="35"&gt;4.771,09&lt;/td&gt;

      &lt;td&gt;264,112&lt;/td&gt;

      &lt;td&gt;5.802,42&lt;/td&gt;

      &lt;td&gt;0,462&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="80"&gt;80.000&lt;/td&gt;

      &lt;td width="80"&gt;3.469,49&lt;/td&gt;

      &lt;td width="35"&gt;6.116,47&lt;/td&gt;

      &lt;td&gt;309,691&lt;/td&gt;

      &lt;td&gt;10,075&lt;/td&gt;

      &lt;td&gt;0,545&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="80"&gt;90.000&lt;/td&gt;

      &lt;td width="80"&gt;4.000,00&lt;/td&gt;

      &lt;td width="35"&gt;6.134,66&lt;/td&gt;

      &lt;td&gt;372,885&lt;/td&gt;

      &lt;td&gt;9,876&lt;/td&gt;

      &lt;td&gt;0,435&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="80"&gt;100.000&lt;/td&gt;

      &lt;td width="80"&gt;4.544,33&lt;/td&gt;

      &lt;td width="35"&gt;6.932,08&lt;/td&gt;

      &lt;td&gt;424,196&lt;/td&gt;

      &lt;td&gt;9,024&lt;/td&gt;

      &lt;td&gt;0,41&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/Modidiversidirecuperareilnumerodimessagg_ABED/image_10.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/Modidiversidirecuperareilnumerodimessagg_ABED/image_thumb.png" width="244" height="148" /&gt;&lt;/a&gt; 

&lt;p&gt;&lt;strong&gt;Seconda Iterazione&lt;/strong&gt;&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="0" border="0"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td width="77"&gt;#Msgs&lt;/td&gt;

      &lt;td width="78"&gt;MSMQ Cursor&lt;/td&gt;

      &lt;td width="40"&gt;GetAllMessages&lt;/td&gt;

      &lt;td width="65"&gt;GetEnumerator2&lt;/td&gt;

      &lt;td width="118"&gt;PowerShell&lt;/td&gt;

      &lt;td width="97"&gt;Performance C.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="77"&gt;10.000&lt;/td&gt;

      &lt;td width="78"&gt;475,357&lt;/td&gt;

      &lt;td width="40"&gt;609,866&lt;/td&gt;

      &lt;td&gt;38,022&lt;/td&gt;

      &lt;td&gt;285,978&lt;/td&gt;

      &lt;td&gt;351,955&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="77"&gt;20.000&lt;/td&gt;

      &lt;td width="78"&gt;912,591&lt;/td&gt;

      &lt;td width="40"&gt;1.315,49&lt;/td&gt;

      &lt;td&gt;76,912&lt;/td&gt;

      &lt;td&gt;10,453&lt;/td&gt;

      &lt;td&gt;0,502&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="77"&gt;30.000&lt;/td&gt;

      &lt;td width="78"&gt;1.417,26&lt;/td&gt;

      &lt;td width="40"&gt;2.066,92&lt;/td&gt;

      &lt;td&gt;122,745&lt;/td&gt;

      &lt;td&gt;11,156&lt;/td&gt;

      &lt;td&gt;0,366&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="77"&gt;40.000&lt;/td&gt;

      &lt;td width="78"&gt;1.901,66&lt;/td&gt;

      &lt;td width="40"&gt;2.718,64&lt;/td&gt;

      &lt;td&gt;153,373&lt;/td&gt;

      &lt;td&gt;9,947&lt;/td&gt;

      &lt;td&gt;0,349&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="77"&gt;50.000&lt;/td&gt;

      &lt;td width="78"&gt;2.393,97&lt;/td&gt;

      &lt;td width="40"&gt;3.386,43&lt;/td&gt;

      &lt;td&gt;203,553&lt;/td&gt;

      &lt;td&gt;10,962&lt;/td&gt;

      &lt;td&gt;0,358&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="77"&gt;60.000&lt;/td&gt;

      &lt;td width="78"&gt;2.659,28&lt;/td&gt;

      &lt;td width="40"&gt;4.546,84&lt;/td&gt;

      &lt;td&gt;280,257&lt;/td&gt;

      &lt;td&gt;9,832&lt;/td&gt;

      &lt;td&gt;0,413&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="77"&gt;70.000&lt;/td&gt;

      &lt;td width="78"&gt;3.246,77&lt;/td&gt;

      &lt;td width="40"&gt;4.938,01&lt;/td&gt;

      &lt;td&gt;278,404&lt;/td&gt;

      &lt;td&gt;11,664&lt;/td&gt;

      &lt;td&gt;0,517&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="77"&gt;80.000&lt;/td&gt;

      &lt;td width="78"&gt;3.718,89&lt;/td&gt;

      &lt;td width="40"&gt;5.881,67&lt;/td&gt;

      &lt;td&gt;330,857&lt;/td&gt;

      &lt;td&gt;13,688&lt;/td&gt;

      &lt;td&gt;0,506&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="77"&gt;90.000&lt;/td&gt;

      &lt;td width="78"&gt;4.230,99&lt;/td&gt;

      &lt;td width="40"&gt;6.677,00&lt;/td&gt;

      &lt;td&gt;362,374&lt;/td&gt;

      &lt;td&gt;10,155&lt;/td&gt;

      &lt;td&gt;0,508&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="77"&gt;100.000&lt;/td&gt;

      &lt;td width="78"&gt;4.832,89&lt;/td&gt;

      &lt;td width="40"&gt;7.585,19&lt;/td&gt;

      &lt;td&gt;464,216&lt;/td&gt;

      &lt;td&gt;16,495&lt;/td&gt;

      &lt;td&gt;0,681&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/Modidiversidirecuperareilnumerodimessagg_ABED/image_12.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/Modidiversidirecuperareilnumerodimessagg_ABED/image_thumb_4.png" width="244" height="148" /&gt;&lt;/a&gt; 

&lt;p&gt;&lt;strong&gt;Terza Iterazione&lt;/strong&gt;&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="0" width="541" border="0"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td width="86"&gt;#Msgs&lt;/td&gt;

      &lt;td width="103"&gt;MSMQ Cursor&lt;/td&gt;

      &lt;td width="10"&gt;GetAllMessages&lt;/td&gt;

      &lt;td width="65"&gt;GetEnumerator2&lt;/td&gt;

      &lt;td width="118"&gt;PowerShell&lt;/td&gt;

      &lt;td width="161"&gt;Performance C.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="86"&gt;10.000&lt;/td&gt;

      &lt;td width="103"&gt;533,294&lt;/td&gt;

      &lt;td width="10"&gt;621,392&lt;/td&gt;

      &lt;td&gt;41,496&lt;/td&gt;

      &lt;td&gt;79,286&lt;/td&gt;

      &lt;td width="161"&gt;376,431&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="86"&gt;20.000&lt;/td&gt;

      &lt;td width="103"&gt;911,513&lt;/td&gt;

      &lt;td width="10"&gt;1.338,41&lt;/td&gt;

      &lt;td&gt;79,827&lt;/td&gt;

      &lt;td&gt;9,354&lt;/td&gt;

      &lt;td width="161"&gt;0,38&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="86"&gt;30.000&lt;/td&gt;

      &lt;td width="103"&gt;1.339,34&lt;/td&gt;

      &lt;td width="10"&gt;2.123,46&lt;/td&gt;

      &lt;td&gt;120,693&lt;/td&gt;

      &lt;td&gt;12,969&lt;/td&gt;

      &lt;td width="161"&gt;0,414&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="86"&gt;40.000&lt;/td&gt;

      &lt;td width="103"&gt;1.799,28&lt;/td&gt;

      &lt;td width="10"&gt;2.658,01&lt;/td&gt;

      &lt;td&gt;158,606&lt;/td&gt;

      &lt;td&gt;9,423&lt;/td&gt;

      &lt;td width="161"&gt;0,374&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="86"&gt;50.000&lt;/td&gt;

      &lt;td width="103"&gt;2.196,96&lt;/td&gt;

      &lt;td width="10"&gt;3.221,87&lt;/td&gt;

      &lt;td&gt;199,273&lt;/td&gt;

      &lt;td&gt;10,413&lt;/td&gt;

      &lt;td width="161"&gt;0,426&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="86"&gt;60.000&lt;/td&gt;

      &lt;td width="103"&gt;2.562,49&lt;/td&gt;

      &lt;td width="10"&gt;4.140,15&lt;/td&gt;

      &lt;td&gt;257,22&lt;/td&gt;

      &lt;td&gt;8,81&lt;/td&gt;

      &lt;td width="161"&gt;0,411&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="86"&gt;70.000&lt;/td&gt;

      &lt;td width="103"&gt;3.358,83&lt;/td&gt;

      &lt;td width="10"&gt;4.715,56&lt;/td&gt;

      &lt;td&gt;327,474&lt;/td&gt;

      &lt;td&gt;14,808&lt;/td&gt;

      &lt;td width="161"&gt;0,53&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="86"&gt;80.000&lt;/td&gt;

      &lt;td width="103"&gt;4.417,58&lt;/td&gt;

      &lt;td width="10"&gt;6.690,44&lt;/td&gt;

      &lt;td&gt;316,044&lt;/td&gt;

      &lt;td&gt;17,334&lt;/td&gt;

      &lt;td width="161"&gt;0,825&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="86"&gt;90.000&lt;/td&gt;

      &lt;td width="103"&gt;4.185,52&lt;/td&gt;

      &lt;td width="10"&gt;6.229,67&lt;/td&gt;

      &lt;td&gt;340,457&lt;/td&gt;

      &lt;td&gt;11,773&lt;/td&gt;

      &lt;td width="161"&gt;0,396&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td width="86"&gt;100.000&lt;/td&gt;

      &lt;td width="103"&gt;4.407,13&lt;/td&gt;

      &lt;td width="10"&gt;6.658,46&lt;/td&gt;

      &lt;td&gt;390,498&lt;/td&gt;

      &lt;td&gt;12,944&lt;/td&gt;

      &lt;td width="161"&gt;0,589&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;
&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/Modidiversidirecuperareilnumerodimessagg_ABED/image_14.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; border-bottom-width: 0px; display: inline; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/Modidiversidirecuperareilnumerodimessagg_ABED/image_thumb_5.png" width="244" height="148" /&gt;&lt;/a&gt; 

&lt;p&gt;Dai risultati ottenuti si ottiene che l’utilizzo del “Performance Counter”, in caso di letture successive, sembrerebbe essere quello più efficiente. &lt;/p&gt;

&lt;p&gt;In attesa di altri giudizi ed approfondimenti :-).&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101412.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/01/28/modi-diversi-di-recuperare-il-numero-di-messaggi-in-una.aspx</guid>
            <pubDate>Mon, 28 Jan 2013 11:13:32 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/01/28/modi-diversi-di-recuperare-il-numero-di-messaggi-in-una.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101412.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101412.aspx</trackback:ping>
        </item>
        <item>
            <title>EF6 Alpha 2</title>
            <category>Entity Framework 6</category>
            <category>C#</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/12/12/ef6-alpha-2.aspx</link>
            <description>&lt;p&gt;Nuova alpha release della versione 6 di Entity Framework, disponibile tramite NuGet. Al solito, tutti i dettagli direttamente sul &lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/12/10/ef6-alpha-2-available-on-nuget.aspx" target="_blank"&gt;post&lt;/a&gt; del blog di ADO.NET.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101367.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/12/12/ef6-alpha-2.aspx</guid>
            <pubDate>Wed, 12 Dec 2012 16:41:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/12/12/ef6-alpha-2.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101367.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101367.aspx</trackback:ping>
        </item>
        <item>
            <title>Visual Studio 2012 Update 1</title>
            <category>.Net Framework 4.5</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/11/27/visual-studio-2012-update-1.aspx</link>
            <description>&lt;p&gt;E’ stato rilasciato “l'’Update 1” di Visual Studio 2012. Download &lt;a href="http://www.microsoft.com/visualstudio/ita/downloads#d-visual-studio-2012-update"&gt;qui&lt;/a&gt; (multi-language), maggiori dettagli, &lt;a href="http://blogs.msdn.com/b/somasegar/archive/2012/11/26/visual-studio-2012-update-1-now-available.aspx?wa=wsignin1.0" target="_blank"&gt;qui&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Per una versione “offline”, è possibile eseguire i passaggi descritti &lt;a href="http://blogs.msdn.com/b/robcaron/archive/2012/11/26/how-to-install-visual-studio-2012-update-1-offline.aspx" target="_blank"&gt;in questo post&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101342.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/11/27/visual-studio-2012-update-1.aspx</guid>
            <pubDate>Tue, 27 Nov 2012 07:46:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/11/27/visual-studio-2012-update-1.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101342.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101342.aspx</trackback:ping>
        </item>
        <item>
            <title>EF6 Alpha 1</title>
            <category>.Net Framework 4.5</category>
            <category>Entity Framework 6</category>
            <category>Tools</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/11/07/ef6-alpha-1.aspx</link>
            <description>&lt;p&gt;Per chi se lo fosse perso :-) : &lt;a href=" http://blogs.msdn.com/b/adonet/archive/2012/10/30/ef6-alpha-1-available-on-nuget.aspx" target="_blank"&gt;EF6 Alpha 1&lt;/a&gt;. Tra le novità più interessanti il supporto &lt;em&gt;Async&lt;/em&gt; per “Query and Save”.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101315.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/11/07/ef6-alpha-1.aspx</guid>
            <pubDate>Wed, 07 Nov 2012 10:24:38 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/11/07/ef6-alpha-1.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101315.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101315.aspx</trackback:ping>
        </item>
        <item>
            <title>Elenco di Micro-Framework&amp;hellip;</title>
            <category>ASP.NET</category>
            <category>Varie ed eventuali</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/09/21/elenco-di-micro-frameworkhellip.aspx</link>
            <description>&lt;p&gt;Post promemoria: interessante ed abbondante elenco di Micro-Framework (completo di “motore di ricerca”) &lt;a href="http://microjs.com" target="_blank"&gt;microjs.com&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101225.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/09/21/elenco-di-micro-frameworkhellip.aspx</guid>
            <pubDate>Fri, 21 Sep 2012 07:01:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/09/21/elenco-di-micro-frameworkhellip.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101225.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101225.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET 4.5 e WebSocket: Real Time e Two-Way (parte 2)</title>
            <category>.Net Framework 4.5</category>
            <category>ASP.NET</category>
            <category>C#</category>
            <category>Windows 8</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/09/10/asp.net-4.5-e-websocket-real-time-e-two-way-parte-2.aspx</link>
            <description>&lt;p&gt;Nella &lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/09/07/asp.net-4.5-e-websocket-real-time-e-two-way-parte.aspx" target="_blank"&gt;prima parte&lt;/a&gt; dell’articolo abbiamo introdotto i &lt;em&gt;&lt;a href="en.wikipedia.org/wiki/WebSocket" target="_blank"&gt;WebSocket&lt;/a&gt;&lt;/em&gt; sviluppando una semplice applicazione composta da un client che invia dei messaggi di testo ad un server (&lt;em&gt;WebSocket Server&lt;/em&gt;), il quale risponde inviando un testo ed un numero che rappresenta la lunghezza del messaggio ricevuto. Nel post precedente abbiamo descritto con maggior dettaglio il codice lato  &lt;em&gt;client&lt;/em&gt; demandando a questa seconda parte maggiori approfondimenti relativamente alla parte  &lt;em&gt;server &lt;/em&gt;il cui codice è composto dalla semplice classe &lt;em&gt;WebSochetHandler.ashx&lt;/em&gt;, la quale implementa l’interfaccia &lt;em&gt;IHttpHandler,&lt;/em&gt; ragion per cui  è necessario scrivere del  codice per il metodo &lt;em&gt;ProcessRequest(HttpContext context)&lt;/em&gt;, per l’elaborazione delle richieste Web HTTP, e la proprietà  &lt;em&gt;IsReusable  &lt;/em&gt;che restituisce un valore che indica se sia possibile riciclare la stessa istanza di classe che implementa &lt;em&gt;IHttpHandler&lt;/em&gt; per una successiva richiesta.&lt;/p&gt;  &lt;p&gt;Per quanto concerne &lt;em&gt;IsReusable&lt;/em&gt;, non dovendo memorizzare nulla tra una richiesta e l’altra,  il codice è semplicemente:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsReusable
{
    get
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
    }
}&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;font color="#393925" size="3" face="Georgia"&gt;Mentre, per il metodo &lt;em&gt;ProcessRequest(…) &lt;/em&gt;abbiamo :&lt;em&gt; &lt;/em&gt;&lt;/font&gt;&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ProcessRequest(HttpContext context)
{
    &lt;span class="kwrd"&gt;if&lt;/span&gt; (context.IsWebSocketRequest)
    {              
        context.AcceptWebSocketRequest(WebSocketRequestHandler);
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        context.Response.StatusCode = 400;
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;pre class="csharpcode"&gt;&lt;font color="#393925" size="3" face="Georgia"&gt;Utilizzando la proprietà &lt;em&gt;IsWebSocketRequest&lt;/em&gt; verifichiamo che la richiesta entrante sia una richiesta &lt;em&gt;WebSocket&lt;/em&gt; valida, in caso positivo &lt;/font&gt;&lt;font color="#393925" size="3" face="Georgia"&gt;demandiamo la gestione della richiesta al metodo&lt;/font&gt;&lt;font color="#393925" size="3" face="Georgia"&gt; &lt;em&gt;WebSocketRequestHandler&lt;/em&gt; così definito:&lt;/font&gt;&lt;/pre&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; async Task WebSocketRequestHandler(WebSocketContext webSocketContext)
{
    &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] buffer = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[MAX_MESSAGE_SIZE];
    WebSocket webSocket = webSocketContext.WebSocket;

    &lt;span class="kwrd"&gt;while&lt;/span&gt; (webSocket.State == WebSocketState.Open)
    {
        WebSocketReceiveResult result = await webSocket.ReceiveAsync(&lt;span class="kwrd"&gt;new&lt;/span&gt; ArraySegment&amp;lt;&lt;span class="kwrd"&gt;byte&lt;/span&gt;&amp;gt;(buffer), CancellationToken.None);

        &lt;span class="kwrd"&gt;switch&lt;/span&gt; (result.MessageType)
        {
            &lt;span class="kwrd"&gt;case&lt;/span&gt; WebSocketMessageType.Close:
                await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, &lt;span class="str"&gt;"Closed."&lt;/span&gt;, CancellationToken.None);
                &lt;span class="kwrd"&gt;break&lt;/span&gt;;
            &lt;span class="kwrd"&gt;case&lt;/span&gt; WebSocketMessageType.Binary:
                await webSocket.CloseAsync(WebSocketCloseStatus.InvalidMessageType, &lt;span class="str"&gt;"Not supported."&lt;/span&gt;, CancellationToken.None);
                &lt;span class="kwrd"&gt;break&lt;/span&gt;;
            &lt;span class="kwrd"&gt;case&lt;/span&gt; WebSocketMessageType.Text:
                &lt;span class="kwrd"&gt;int&lt;/span&gt; count = result.Count;

                &lt;span class="kwrd"&gt;while&lt;/span&gt; (result.EndOfMessage == &lt;span class="kwrd"&gt;false&lt;/span&gt;)
                {
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (count &amp;gt;= MAX_MESSAGE_SIZE)
                    {
                        &lt;span class="kwrd"&gt;string&lt;/span&gt; closeMessage = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"Maximum message size: {0} bytes."&lt;/span&gt;, MAX_MESSAGE_SIZE);
                        await webSocket.CloseAsync(WebSocketCloseStatus.MessageTooBig, closeMessage, CancellationToken.None);
                        &lt;span class="kwrd"&gt;return&lt;/span&gt;;
                    }

                    result = await webSocket.ReceiveAsync(&lt;span class="kwrd"&gt;new&lt;/span&gt; ArraySegment&amp;lt;&lt;span class="kwrd"&gt;byte&lt;/span&gt;&amp;gt;(buffer, count, buffer.Length), CancellationToken.None);
                    count += result.Count;
                }

                &lt;span class="kwrd"&gt;string&lt;/span&gt; receivedMessage = Encoding.UTF8.GetString(buffer, 0, count);
                &lt;span class="kwrd"&gt;string&lt;/span&gt; outputMessage = &lt;span class="str"&gt;"Text Length: "&lt;/span&gt; + receivedMessage.Length;

                await webSocket.SendAsync(&lt;span class="kwrd"&gt;new&lt;/span&gt; ArraySegment&amp;lt;&lt;span class="kwrd"&gt;byte&lt;/span&gt;&amp;gt;(Encoding.UTF8.GetBytes(outputMessage)), WebSocketMessageType.Text, &lt;span class="kwrd"&gt;true&lt;/span&gt;, CancellationToken.None);

                &lt;span class="kwrd"&gt;break&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;In dettaglio, quando invochiamo il metodo &lt;em&gt;WebSocketRequestHandler&lt;/em&gt;, ASP.NET passa un’istanza della classe &lt;a href="http://msdn.microsoft.com/it-it/library/system.net.websockets.websocketcontext.aspx" target="_blank"&gt;WebSocketContext&lt;/a&gt; contenente informazioni quali l’URI utilizzato per stabilire la connessione (compresi i parametri della &lt;em&gt;Query String&lt;/em&gt;) e la collezione dei &lt;em&gt;cookies&lt;/em&gt; inviati. Per accedere ai metodi per la ricezione e l’invio dei dati è necessario accedere alla proprietà &lt;em&gt;WebSocket&lt;/em&gt; . A questo punto, utilizziamo la proprietà &lt;em&gt;State&lt;/em&gt; per verificare lo stato della connessione, rimanendo “in ciclo” finché la connessione rimane aperta. Per ricevere i dati utilizziamo il metodo &lt;em&gt;ReceiveAsync&lt;/em&gt; che accetta due parametri: un &lt;a href="http://msdn.microsoft.com/it-it/library/1hsbd92d.aspx" target="_blank"&gt;ArraySegment&lt;/a&gt; in cui scrivere i dati ricevuti (&lt;em&gt;buffer&lt;/em&gt;) ed un &lt;em&gt;Cancellation Token, &lt;/em&gt;nel nostro caso &lt;em&gt;CancellationToken.None&lt;/em&gt;. Il metodo ritorna un’istanza di &lt;a href="http://msdn.microsoft.com/it-it/library/system.net.websockets.websocketreceiveresult.aspx" target="_blank"&gt;WebSocketReceiveResult&lt;/a&gt;  che rappresenta il risultato di una singola operazione &lt;em&gt;ReceiveAsync&lt;/em&gt;. Tramite la proprietà &lt;em&gt;MessageType&lt;/em&gt; della classe risultato verifichiamo il tipo di messaggio:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;Close: &lt;/em&gt;è stato inviato un &lt;em&gt;close frame &lt;/em&gt;(vedi prima parte). A questo punto il server partecipa &lt;em&gt;all’handshake&lt;/em&gt; di chiusura utilizzando il metodo &lt;em&gt;CloseAsync. &lt;/em&gt;Trattandosi di una normale chiusura, ci limitiamo ad utilizzare la voce &lt;em&gt;Normal &lt;/em&gt;dell’enumerativo &lt;em&gt;WebSocketCloseStatus.&lt;/em&gt; &lt;/li&gt;

  &lt;li&gt;&lt;em&gt;Binary:&lt;/em&gt; non supportato dalla nostra applicazione, pertanto iniziamo il processo di chiusura della connessione e specifichiamo al client che il tipo dati inviato non è supportato (utilizziamo l’apposito valore dell’enumerativo). &lt;/li&gt;

  &lt;li&gt;&lt;em&gt;Text: &lt;/em&gt;tramite la proprietà &lt;em&gt;EndOfMessage&lt;/em&gt;, entriamo in un &lt;em&gt;loop&lt;/em&gt; finché non abbiamo letto il contenuto dell’intero del messaggio (o non si raggiunge la dimensione massima del messaggio). Una volta ricevuto il messaggio, utilizzando &lt;em&gt;l’encoding&lt;/em&gt; opportuno (UTF8, per formati diversi è necessario  utilizzare il formato binario) “leggiamo” la stringa ed inviamo un testo con l’indicazione della lunghezza della stringa ricevuta tramite il metodo &lt;em&gt;SensAsync.&lt;/em&gt; &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Il terzo ed ultimo post della serie dedicato alla “costruzione della lavagna” condivisa tra client Web/Windows utilizzando i WebSocket e l’oggetto HTML &lt;em&gt;canvas&lt;/em&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101209.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/09/10/asp.net-4.5-e-websocket-real-time-e-two-way-parte-2.aspx</guid>
            <pubDate>Mon, 10 Sep 2012 20:14:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/09/10/asp.net-4.5-e-websocket-real-time-e-two-way-parte-2.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101209.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101209.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET 4.5 e WebSocket: Real Time e Two-Way (parte 1)</title>
            <category>.Net Framework 4.5</category>
            <category>C#</category>
            <category>ASP.NET</category>
            <category>WPF</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/09/07/asp.net-4.5-e-websocket-real-time-e-two-way-parte.aspx</link>
            <description>Chi sviluppa per il Web, si scontra ogni giorno con le “limitazioni” del modello request-response di HTTP, il quale non è pensato “ad hoc” per applicazioni real time, o comunicazione bidirezionale client-server. Per questi scenari, spesso vengono utilizzate tecniche di polling, da parte del client, per verificare l’eventuale presenza di dati “freschi”, eseguendo continuamente delle richieste HTTP, comportando dei “costi”: il server deve utilizzare differenti connessioni TCP per ogni client (una per inviare informazioni ed una per rispondere alla richiesta di aggiornamenti), un continuo scambio di messaggi client-server (comportando quindi un aumento del traffico di rete). Potrebbe sembrare cosa da poco, ma se pensiamo ad applicazioni web con migliaia di client connessi, le risorse di server e banda potrebbero essere velocemente consumate (e dato che la nostra epoca è &lt;em&gt;affamata&lt;/em&gt; di risorse potremmo trovarci in situazioni poco piacevoli).   &lt;p&gt;Quindi, quale potrebbe essere la soluzione ? utilizzare una singola connessione TCP per gestire il traffico in entrambe le direzioni, ovvero il protocollo WebSocket, che se gestito mediante le WebSocket API (WSAPI), fornisce un’ottima alternativa alla tecnica di polling di cui parlavamo in precedenza. Possiamo utilizzare i WebSocket in diversi scenari: giochi, applicazioni di editing real time multi-utente, UI web che espongono dati lato server in tempo reale ecc .… tutto questo condividendo le porte standard HTTP 80 e 443, “attraversando” firewalls, proxies e router senza problemi. Possiamo riassumere le due “tecniche” discusse in precedenza con la figura seguente;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/896b2c2d5b0f_5666/image_4.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/896b2c2d5b0f_5666/image_thumb_1.png" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;dalla quale si evince come l’utilizzo del “polling” comporti una maggiore latenza nella trasmissione delle informazioni utili. Nell’immagine, nella comunicazione bidirezionale offerta dai WebSocket, come primo passo (dal client verso il server) c’è la voce “WebSocket upgrade”, cosa sarà mai ?, un passo per volta.&lt;/p&gt;  &lt;p&gt;Il protocollo è diviso in due parti: &lt;em&gt;handshakes&lt;/em&gt; e &lt;em&gt;transfer data. &lt;/em&gt;Durante la  prima parte (di negoziazione),  client e server comunicano scambiandosi dei pacchetti di controllo per stabilire una connessione WebSocket.  Il client invia una richiesta di questo tipo:&lt;/p&gt;  &lt;pre&gt; 
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: &lt;a href="http://example.comSec-WebSocket-Version"&gt;http://example.com
Sec-WebSocket-Version&lt;/a&gt;: 13&lt;/pre&gt;
ed il server (normalmente) dovrebbe rispondere con: 

&lt;pre&gt; 
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=&lt;/pre&gt;

&lt;p&gt;In dettaglio, il processo di connessione parte con una standard GET HTTP, e fin qui tutto regolare:&lt;/p&gt;

&lt;pre&gt;GET /echo HTTP/1.1
Host: example.microsoft.com&lt;/pre&gt;

&lt;p&gt;poi, &lt;em&gt;l’header&lt;/em&gt; “Upgrade” richiede al server di cambiare il protocollo a livello di &lt;em&gt;application-layer&lt;/em&gt; da HTTP a WebSocket:&lt;/p&gt;

&lt;pre&gt;Upgrade: websocket
Connection: Upgrade&lt;/pre&gt;

&lt;p&gt;Il valore presente in &lt;em&gt;Sec-WebSocket-Key&lt;/em&gt; inviato dal client verrà utilizzato dal server per far capire al chiamante che “comprende” la richiesta:&lt;/p&gt;

&lt;pre&gt;Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==&lt;/pre&gt;

&lt;p&gt;L’&lt;em&gt;header Sec-WebSocket-Version &lt;/em&gt;identifica la versione del protocollo da utilizzare:&lt;/p&gt;

&lt;pre&gt;Sec-WebSocket-Version: 13&lt;/pre&gt;

&lt;p&gt;A questo punto, se il server “comprende” la nostra richiesta , il server eseguirà un “Upgrade” &lt;em&gt;dell’application-layer&lt;/em&gt; e risponderà con lo stato HTTP 101. Il valore contenuto in &lt;em&gt;Sec-WebSocket-Accept &lt;/em&gt;verrà utilizzato dal client per validare che il server è un WebSocket server e non un “semplice” HTTP server. &lt;/p&gt;

&lt;p&gt;Una volta che client e server hanno entrambi inviati i loro &lt;em&gt;handshakes&lt;/em&gt;, (e &lt;em&gt;l’handshaking&lt;/em&gt; ha avuto successo) può iniziare il trasferimento dati su un unico canale di comunicazione bidirezionale, tra client e server, sfruttando la connessione TCP precedentemente stabilita.&lt;/p&gt;

&lt;p&gt;I dati trasferiti tra le due parti sono racchiusi in unità logiche chiamate “messaggi”, ogni messaggio è fisicamente  composto da uno o più &lt;em&gt;frames&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Dopo la teoria la pratica…&lt;/p&gt;

&lt;p&gt;Il protocollo WebSocket, definisce due nuove tipologie di URI:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;ws://host [: port] path [? query] (di default usa la porta 80 e connessione non cifrata) &lt;/li&gt;

  &lt;li&gt;wss://host [:port] path [? query] (di default utilizza la porta 443, ed una connessione cifrata HTTP over TLS) &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Le ultime specifiche del protocollo  sono definite nel documento &lt;a href="http://tools.ietf.org/html/rfc6455" target="_blank"&gt;RFC 6455&lt;/a&gt;. Per “sporcarci le mani” con i  WebSocket, possiamo sviluppare un semplice pagina web con estensione &lt;em&gt;.html&lt;/em&gt;, come la seguente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/896b2c2d5b0f_5666/image_6.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/896b2c2d5b0f_5666/image_thumb_2.png" width="244" height="174" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I bottoni &lt;em&gt;Open&lt;/em&gt; e &lt;em&gt;Close&lt;/em&gt;, sono rispettivamente utilizzati per aprire e chiudere la connessione del WebSocket, mentre il campo &lt;em&gt;text &lt;/em&gt;per inviare un messaggio al server, il quale risponderà inviando al client la lunghezza della stringa inviata (ovviamente il livello pratico dell’esempio è praticamente nullo &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Sorriso" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/896b2c2d5b0f_5666/wlEmoticon-smile_2.png" /&gt;).&lt;/p&gt;

&lt;p&gt;Per stabilire una connessione con il server, utilizziamo le seguenti righe di codice client-script:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; uri = &lt;span class="str"&gt;'ws://localhost:9915/WebSocketHandler.ashx'&lt;/span&gt;;
websocket = &lt;span class="kwrd"&gt;new&lt;/span&gt; WebSocket(uri);&lt;/pre&gt;

&lt;p /&gt;&lt;style type="text/css"&gt;&lt;![CDATA[






.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;Per conoscere quando la connessione con il server è stata creata è necessario sottoscriversi all’evento &lt;em&gt;onopen:&lt;/em&gt;

&lt;pre class="csharpcode"&gt; websocket.onopen = &lt;span class="kwrd"&gt;function&lt;/span&gt; () {
    appendData(&lt;span class="str"&gt;"Connected."&lt;/span&gt;);
    appendData(uri);

    $(&lt;span class="str"&gt;'#wsform'&lt;/span&gt;).submit(&lt;span class="kwrd"&gt;function&lt;/span&gt; (&lt;span class="kwrd"&gt;event&lt;/span&gt;) {
        websocket.send($(&lt;span class="str"&gt;'#inputbox'&lt;/span&gt;).val());
        $(&lt;span class="str"&gt;'#inputbox'&lt;/span&gt;).val(&lt;span class="str"&gt;''&lt;/span&gt;);
        &lt;span class="kwrd"&gt;event&lt;/span&gt;.preventDefault();
    });

    $(&lt;span class="str"&gt;"#closeButton"&lt;/span&gt;).removeAttr(&lt;span class="str"&gt;"disabled"&lt;/span&gt;);
};&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[






.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;Con lo script precedente, all’apertura della connessione visualizziamo il messaggio “Connected.” e l’URI utilizzato per la connessione. Dopodiché ci registriamo all’evento &lt;em&gt;submit &lt;/em&gt;per inviare al server, utilizzando l’API &lt;em&gt;Send,&lt;/em&gt; messaggi al WebSocket server sotto forma di testo UTF-8 o Blobs. 

&lt;p&gt;Per ricevere messaggi, dobbiamo registrarsi all’evento &lt;em&gt;onmessagge&lt;/em&gt; dell’oggetto &lt;em&gt;websocket&lt;/em&gt; il quale riceve &lt;em&gt;messageEvent&lt;/em&gt; che espone la proprietà &lt;em&gt;data&lt;/em&gt;, contenente le informazioni inviate al client: &lt;/p&gt;

&lt;pre class="csharpcode"&gt;websocket.onmessage = &lt;span class="kwrd"&gt;function&lt;/span&gt; (&lt;span class="kwrd"&gt;messageEvent&lt;/span&gt;) {
    &lt;span class="kwrd"&gt;var&lt;/span&gt; receivedData = &lt;span class="kwrd"&gt;messageEvent&lt;/span&gt;.data.toString();
    appendData(receivedData);
};&lt;/pre&gt;

&lt;p&gt;Il codice precedente è veramente banale, in quanto si limita a recuperare il testo inviato dal server in risposta al client e visualizzarlo sul browser tramite un &lt;em&gt;div&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Come per l’apertura, c’è una sorta di &lt;em&gt;handshaking&lt;/em&gt; per la chiusura della connessione, che può essere iniziata indipendentemente dal client o dal server. Chi inizia il processo di chiusura, invia uno speciale frame, detto &lt;em&gt;close &lt;/em&gt;&lt;em&gt;frame, &lt;/em&gt;che può contenere, opzionalmente, un codice di stato (il protocollo fornisce un insieme di codici di stato appropriati per la chiusura) e la ragione  (una descrizione testuale) della chiusura. Quando una delle due parti riceve un &lt;em&gt;close frame&lt;/em&gt;, invia lo stesso frame all’altra parte (eventualmente, prima di rinviarlo, invia i messaggi &lt;em&gt;pending&lt;/em&gt;) e la comunicazione viene chiusa.&lt;/p&gt;

&lt;p&gt;Per iniziare il processo di &lt;em&gt;close handshake&lt;/em&gt;, bisogna invocare l’API &lt;em&gt;close:&lt;/em&gt;&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; closeWebSocket() {
   websocket.close(1000, &lt;span class="str"&gt;"Normal."&lt;/span&gt;);
}&lt;/pre&gt;

&lt;p&gt;Il valore 1000 indica lo stato “Normal Closure”. Come “ragione” della chiusura specifichiamo il testo “Normal”. Per sapere quando la chiusura è stata completata, ci sottoscriviamo all’evento &lt;em&gt;onclose&lt;/em&gt;:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;websocket.onclose = &lt;span class="kwrd"&gt;function&lt;/span&gt; () {
    appendData(&lt;span class="str"&gt;"Closed."&lt;/span&gt;);

    $(&lt;span class="str"&gt;"#closeButton"&lt;/span&gt;).attr(&lt;span class="str"&gt;"disabled"&lt;/span&gt;, &lt;span class="str"&gt;"disabled"&lt;/span&gt;);
};&lt;/pre&gt;

&lt;p&gt;Con la funzione precedente, visualizziamo il messaggio “Closed.”, e disabilitiamo il &lt;em&gt;button &lt;/em&gt;per la chiusura del WebSocket.&lt;/p&gt;

&lt;p&gt;La parte &lt;em&gt;server &lt;/em&gt;è composta da una classe &lt;em&gt;IHttpHandler&lt;/em&gt; che fa uso della classe &lt;em&gt;WebSocketContext &lt;/em&gt;(.NET 4.5) utilizzata per accedere alle informazioni di WebSocket &lt;em&gt;handshake&lt;/em&gt;. Attraverso altri semplici post, l’obiettivo è realizzare una semplice “lavagna” interattiva real time, utilizzando sia un browser web, che un client WPF, come mostrato seguente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/896b2c2d5b0f_5666/image_8.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/896b2c2d5b0f_5666/image_thumb_3.png" width="244" height="120" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A tal fine, utilizzeremo lato Windows, la classe &lt;em&gt;ClientWebSocket&lt;/em&gt;, presente nel namespace &lt;em&gt;System.Net.WebSockets&lt;/em&gt;, la quale fornisce un client per connettersi a servizi esposti tramite WebSocket.&lt;/p&gt;

&lt;div id="scid:fb3a1972-4489-4e52-abe7-25a00bb07fdf:c48c848e-1b4e-4e73-8296-91ef7c42d243" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt;&lt;p&gt;Source Code &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/896b2c2d5b0f_5666/WebSocketsSample.zip" target="_blank"&gt;Source Code&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101203.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/09/07/asp.net-4.5-e-websocket-real-time-e-two-way-parte.aspx</guid>
            <pubDate>Fri, 07 Sep 2012 04:58:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/09/07/asp.net-4.5-e-websocket-real-time-e-two-way-parte.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101203.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101203.aspx</trackback:ping>
        </item>
        <item>
            <title>Web API: Circular Object References</title>
            <category>.Net Framework 4.5</category>
            <category>C#</category>
            <category>ASP.NET</category>
            <category>Entity Framework 5</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/22/web-api-circular-object-references.aspx</link>
            <description>&lt;p&gt;Quando utilizziamo le Web API, per leggere e scrivere oggetti nel corpo di un messaggio Http utilizziamo delle classi particolari, le media-type formatters. "Gratis" Web API fornisce media-type formatters per JSON e XML, utilizzate secondo della richiesta da parte dei client (“Accept”). Se JSON e XML non sono i "formati" di cui abbiamo bisogno possiamo sempre creare la nostra classe derivata da &lt;em&gt;MediaTypeFormatter&lt;/em&gt; o &lt;em&gt;BufferedMediaTypeFormatter&lt;/em&gt;, rispettivamente per scenari asincroni o sincroni, ma non sono l’argomento di questo post promemoria.&lt;/p&gt;  &lt;p&gt;Quando abbiamo a che fare con grafi di oggetti complessi, possono crearsi situazioni in cui abbiamo riferimenti circolari tra oggetti. Ad esempio in uno scenario di questo tipo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/4c85039d270e_1360F/image_2.png"&gt;&lt;img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/4c85039d270e_1360F/image_thumb.png" width="244" height="161" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Dove abbiamo due classi, Book ed Author , referenziate tramite &lt;em&gt;collection&lt;/em&gt; (praticamente un’associazione molti-a-molti) l’una con l’altra. &lt;/p&gt;  &lt;p&gt;Se abbiamo una Web API di questo tipo :&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; BookshelfDb _db = &lt;span class="kwrd"&gt;new&lt;/span&gt; BookshelfDb();
&lt;span class="kwrd"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Book&amp;gt; GetBooks()
{
    &lt;span class="kwrd"&gt;return&lt;/span&gt; _db.Books.Include(b =&amp;gt; b.Authors).AsEnumerable();
}
...&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;ed una configurazione standard delle Web API, ad eccezione dell’indentatura:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;JsonMediaTypeFormatter json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.Indent = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;In presenza di dati, invocando GetBooks() (ad esempio tramite browser), otterremo un’eccezione di questo tipo:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;{ 
  &lt;span class="str"&gt;"Message"&lt;/span&gt;: &lt;span class="str"&gt;"An error has occurred."&lt;/span&gt;, 
  &lt;span class="str"&gt;"ExceptionMessage"&lt;/span&gt;: &lt;span class="str"&gt;"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'."&lt;/span&gt;, 
  &lt;span class="str"&gt;"ExceptionType"&lt;/span&gt;: &lt;span class="str"&gt;"System.InvalidOperationException"&lt;/span&gt;, 
  &lt;span class="str"&gt;"StackTrace"&lt;/span&gt;: &lt;span class="kwrd"&gt;null&lt;/span&gt;, 
  &lt;span class="str"&gt;"InnerException"&lt;/span&gt;: { 
    &lt;span class="str"&gt;"Message"&lt;/span&gt;: &lt;span class="str"&gt;"An error has occurred."&lt;/span&gt;, 
    &lt;span class="str"&gt;"ExceptionMessage"&lt;/span&gt;: &lt;span class="str"&gt;"&lt;strong&gt;Self referencing loop detected with&lt;/strong&gt; type 'BookshelfWebApi.Models.Book'. Path '[0].Authors[0].Books'."&lt;/span&gt;, 
    &lt;span class="str"&gt;"ExceptionType"&lt;/span&gt;: &lt;span class="str"&gt;"Newtonsoft.Json.JsonSerializationException"&lt;/span&gt;, 
    &lt;span class="str"&gt;"StackTrace"&lt;/span&gt;: "   …
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;La soluzione al problema è abbastanza semplice  in quanto è sufficiente aggiungere la riga:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Il caso Xml, non è immediato come nel caso JSON, in quanto è necessario decorare le classi con l’attributo &lt;em&gt;DataContract&lt;/em&gt; impostando la proprietà &lt;em&gt;IsReference&lt;/em&gt; a &lt;em&gt;true&lt;/em&gt;. In questo caso però è necessario decorare anche le proprietà con l’attributo &lt;em&gt;DataMember&lt;/em&gt;:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[DataContract(IsReference = &lt;span class="kwrd"&gt;true&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Book
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; Book()
    {
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.Authors = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Author&amp;gt;();
    }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Paperback { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ISBN_10 { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ISBN_13 { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Language { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Publisher { get; set; }
    [DataMember()]
    &lt;span class="kwrd"&gt;public&lt;/span&gt; ICollection&amp;lt;Author&amp;gt; Authors { get; set; }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;

&lt;p&gt;Se non si vuole “sporcare” le classi “farcendole” di attributi possiamo optare per un &lt;em&gt;DataContractSerializer. &lt;/em&gt;Le Web API possono essere configurate modificando il codice presente nella classe WebApiConfig.cs:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/4c85039d270e_1360F/image_4.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/4c85039d270e_1360F/image_thumb_1.png" width="244" height="225" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quanto detto è sicuramente famigliare per chi espone entità collegate tramite Http, ad esempio utilizzando WCF.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101168.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/22/web-api-circular-object-references.aspx</guid>
            <pubDate>Wed, 22 Aug 2012 08:17:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/22/web-api-circular-object-references.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101168.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101168.aspx</trackback:ping>
        </item>
        <item>
            <title>DomusDotNet: ALM@Work</title>
            <category>Varie ed eventuali</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/21/domusdotnet-almwork.aspx</link>
            <description>&lt;p&gt;Pubblicata l'agenda dell'evento ALM@Work organizzato da DomusDotNet per il 28 settembre 2012 presso la sede Microsoft di Roma, insieme a Matteo Emili e Gian Maria Ricci, MVP italiani di Visual Studio ALM.&lt;/p&gt;
&lt;p&gt;Tutti i dettagli dell'agenda ed il link per l'iscrizione &lt;a href="http://www.domusdotnet.org/eventi/almatwork.aspx"&gt;qui&lt;/a&gt; . &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101167.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/21/domusdotnet-almwork.aspx</guid>
            <pubDate>Tue, 21 Aug 2012 17:57:45 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/21/domusdotnet-almwork.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101167.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101167.aspx</trackback:ping>
        </item>
        <item>
            <title>EF5 Released</title>
            <category>.Net Framework 4.5</category>
            <category>Entity Framework 5</category>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/16/ef5-released.aspx</link>
            <description>&lt;p&gt;Con l’arrivo in RTM di Windows 8 e Visual Studio 2012 è stata rilasciata la nuova versione di Entity Framework (scaricabile ovviamente tramite NuGet). Le novità presenti sono diverse, quella più “gettonata” è sicuramente il supporto agli “Enum”. Diverse novità coinvolgono anche il Designer di EF per Visual Studio 2012, come il supporto a diagrammi multipli per lo stesso modello (una delle funzionalità che più apprezzo).&lt;/p&gt;  &lt;p&gt; Per tutti i dettagli del caso, per la compatibilità delle funzioni utilizzabili secondo del targeting del .NET Framework, lista dei bug corretti ed altro, è possibile iniziare da &lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/08/15/ef5-released.aspx" target="_blank"&gt;qui&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101156.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/16/ef5-released.aspx</guid>
            <pubDate>Thu, 16 Aug 2012 05:54:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/08/16/ef5-released.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101156.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101156.aspx</trackback:ping>
        </item>
    </channel>
</rss>