<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>Windows 8</title>
        <link>http://blogs.ugidotnet.org/PietroLibroBlog/category/Windows 8.aspx</link>
        <description>Windows 8</description>
        <language>it-IT</language>
        <copyright>Pietro Libro</copyright>
        <managingEditor>pietro.libro@libero.it</managingEditor>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Le (mie) prime Windows 8 App Store (2)</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/06/03/le-mie-prime-windows-8-app-store-2.aspx</link>
            <description>L'obiettivo era di 8  App presenti su Windows Store  entro la fine di maggio, ma alla fine sono arrivato "solo" a 7. Le App che si aggiungono all'elenco precedente sono:     Roma Trova Hotel        Impianti Sportivi Roma        Scuole Comunali Infanzia Roma     Sono principalmente delle "App Catalogo" con funzionalità di ricerca (è stata l'occasione per utilizzare SQLite). Per alcune delle 7, saranno presto rilasciati degli aggiornamenti che aggiungeranno nuove funzionalità.    Critiche e consigli costruttivi sono sempre  ben accetti.&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101573.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/06/03/le-mie-prime-windows-8-app-store-2.aspx</guid>
            <pubDate>Mon, 03 Jun 2013 09:11:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/06/03/le-mie-prime-windows-8-app-store-2.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101573.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101573.aspx</trackback:ping>
        </item>
        <item>
            <title>Le (mie) prime Windows 8 App Store</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/04/24/le-mie-prime-windows-8-app-store.aspx</link>
            <description>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 :   Lazio: Cultura e Turismo  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: http://www.futouring.eu.   Farmacie Italiane  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".   Istituti Scolastici Provincia di Roma  "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".   Roma ProvinciaWiFi  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".  Buon divertimento :-D.&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 09:58:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/04/24/le-mie-prime-windows-8-app-store.aspx#feedback</comments>
            <slash:comments>1</slash: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 4.5 e WebSocket: Real Time e Two-Way (parte 2)</title>
            <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>Nella prima parte dell’articolo abbiamo introdotto i WebSocket sviluppando una semplice applicazione composta da un client che invia dei messaggi di testo ad un server (WebSocket Server), 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  client demandando a questa seconda parte maggiori approfondimenti relativamente alla parte  server il cui codice è composto dalla semplice classe WebSochetHandler.ashx, la quale implementa l’interfaccia IHttpHandler, ragion per cui  è necessario scrivere del  codice per il metodo ProcessRequest(HttpContext context), per l’elaborazione delle richieste Web HTTP, e la proprietà  IsReusable  che restituisce un valore che indica se sia possibile riciclare la stessa istanza di classe che implementa IHttpHandler per una successiva richiesta.  Per quanto concerne IsReusable, non dovendo memorizzare nulla tra una richiesta e l’altra,  il codice è semplicemente:  public bool IsReusable
{
    get
    {
        return true;
    }
}

Mentre, per il metodo ProcessRequest(…) abbiamo : 

public void ProcessRequest(HttpContext context)
{
    if (context.IsWebSocketRequest)
    {              
        context.AcceptWebSocketRequest(WebSocketRequestHandler);
    }
    else
    {
        context.Response.StatusCode = 400;
    }
}


Utilizzando la proprietà IsWebSocketRequest verifichiamo che la richiesta entrante sia una richiesta WebSocket valida, in caso positivo demandiamo la gestione della richiesta al metodo WebSocketRequestHandler così definito:

public async Task WebSocketRequestHandler(WebSocketContext webSocketContext)
{
    byte[] buffer = new byte[MAX_MESSAGE_SIZE];
    WebSocket webSocket = webSocketContext.WebSocket;

    while (webSocket.State == WebSocketState.Open)
    {
        WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment&amp;lt;byte&amp;gt;(buffer), CancellationToken.None);

        switch (result.MessageType)
        {
            case WebSocketMessageType.Close:
                await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed.", CancellationToken.None);
                break;
            case WebSocketMessageType.Binary:
                await webSocket.CloseAsync(WebSocketCloseStatus.InvalidMessageType, "Not supported.", CancellationToken.None);
                break;
            case WebSocketMessageType.Text:
                int count = result.Count;

                while (result.EndOfMessage == false)
                {
                    if (count &amp;gt;= MAX_MESSAGE_SIZE)
                    {
                        string closeMessage = string.Format("Maximum message size: {0} bytes.", MAX_MESSAGE_SIZE);
                        await webSocket.CloseAsync(WebSocketCloseStatus.MessageTooBig, closeMessage, CancellationToken.None);
                        return;
                    }

                    result = await webSocket.ReceiveAsync(new ArraySegment&amp;lt;byte&amp;gt;(buffer, count, buffer.Length), CancellationToken.None);
                    count += result.Count;
                }

                string receivedMessage = Encoding.UTF8.GetString(buffer, 0, count);
                string outputMessage = "Text Length: " + receivedMessage.Length;

                await webSocket.SendAsync(new ArraySegment&amp;lt;byte&amp;gt;(Encoding.UTF8.GetBytes(outputMessage)), WebSocketMessageType.Text, true, CancellationToken.None);

                break;
        }
    }
}


In dettaglio, quando invochiamo il metodo WebSocketRequestHandler, ASP.NET passa un’istanza della classe WebSocketContext contenente informazioni quali l’URI utilizzato per stabilire la connessione (compresi i parametri della Query String) e la collezione dei cookies inviati. Per accedere ai metodi per la ricezione e l’invio dei dati è necessario accedere alla proprietà WebSocket . A questo punto, utilizziamo la proprietà State per verificare lo stato della connessione, rimanendo “in ciclo” finché la connessione rimane aperta. Per ricevere i dati utilizziamo il metodo ReceiveAsync che accetta due parametri: un ArraySegment in cui scrivere i dati ricevuti (buffer) ed un Cancellation Token, nel nostro caso CancellationToken.None. Il metodo ritorna un’istanza di WebSocketReceiveResult  che rappresenta il risultato di una singola operazione ReceiveAsync. Tramite la proprietà MessageType della classe risultato verifichiamo il tipo di messaggio:


  Close: è stato inviato un close frame (vedi prima parte). A questo punto il server partecipa all’handshake di chiusura utilizzando il metodo CloseAsync. Trattandosi di una normale chiusura, ci limitiamo ad utilizzare la voce Normal dell’enumerativo WebSocketCloseStatus. 

  Binary: 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). 

  Text: tramite la proprietà EndOfMessage, entriamo in un loop 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 l’encoding 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 SensAsync. 


Il terzo ed ultimo post della serie dedicato alla “costruzione della lavagna” condivisa tra client Web/Windows utilizzando i WebSocket e l’oggetto HTML canvas.&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 23: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>DomusDotNet: ASP.NET Web API (Parte1)</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/07/05/domusdotnet-asp.net-web-api-parte1.aspx</link>
            <description>Prima parte della serie dedicata ad ASP.NET Web API. Codice sorgente ed articolo completo su DomusDotNet. &lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101088.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/07/05/domusdotnet-asp.net-web-api-parte1.aspx</guid>
            <pubDate>Thu, 05 Jul 2012 08:12:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2012/07/05/domusdotnet-asp.net-web-api-parte1.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101088.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101088.aspx</trackback:ping>
        </item>
        <item>
            <title>Nuovo blog di MSDN&amp;hellip;</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/08/17/nuovo-blog-di-msdnhellip.aspx</link>
            <description>…per seguire tutte le novità su Windows 8: Building Windows 8&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/100270.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/08/17/nuovo-blog-di-msdnhellip.aspx</guid>
            <pubDate>Wed, 17 Aug 2011 07:22:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2011/08/17/nuovo-blog-di-msdnhellip.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/100270.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/100270.aspx</trackback:ping>
        </item>
    </channel>
</rss>