Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Windows Azure: interagire con il Cloud Storage da Visual Basic 2010 - terza parte

Nella precedente trattazione siamo andati avanti con la preparazione di una classe di servizio per facilitare l'accesso al Cloud Storage di Windows Azure con Visual Basic 2010.

In particolare abbiamo visto come caricare, scaricare ed eliminare blob dallo spazio di archiviazione. Riprendiamo il discorso apportando qualche miglioramento alla classe in questione, ripercorrendo il percorso che ho fatto nello sviluppare l'applicazione Azure Blob Studio 2011.

Il primo miglioramento che facciamo è l'aggiunta di un metodo che ci permetta di determinare se lo Storage Emulator sia in esecuzione sul nostro sistema; questo può esserci utile per evitare degli errori nel momento in cui tentiamo di accedere allo storage locale con l'account Developer. Il metodo in questione verifica che il processo relativo all'emulator (DSService.exe) sia in esecuzione; in caso negativo, determina il suo percorso leggendolo dal registro di sistema e quindi lo lancia:

    Public Shared Function CheckIfDevelopmentStorageIsRunning() As Boolean
        'If the development storage is not running, then launches it
        Dim IsDevelopmentStorageRunning = Process.GetProcessesByName("DSService")


        If IsDevelopmentStorageRunning.Length = 0 Then
            Dim sdkPath As String = CStr(My.Computer.
                                    Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\ServiceHosting\v1.3",
                                    "InstallPath"Nothing))
            Try
                Process.Start(sdkPath + "bin\devstore\DSService.exe")
                System.Threading.Thread.Sleep(4000)

                IsDevelopmentStorageRunning = Nothing
                Return True
            Catch ex As Exception
                Return False
            End Try
            'Waiting for the Development Storage to be ready.
        Else
            Return True
        End If
    End Function

Ho messo, per pura brevità, un ritardo nel thread di 4 secondi durante i quali possiamo star tranquilli che il servizio di storage si attivi. Ci sono altre modalità, come ad esempio metodi e proprietà di istanza della classe Process per accertarci che il processo sia attivo. Qualunque sia il modo prescelto per farlo, è bene accertarsene.

Fatto questo, passiamo a migliorare il codice precedentemente implementato con degli eventi. Una cosa fatta come si deve dovrebbe notificare ai client che l'upload di un blob sta iniziando e che magari è stato completato con successo; stesso dicasi per altre attività. Creiamo innanzitutto una classe chiamata BlobServiceEventArgs che verrà passata agli eventi e che conterrà informazioni sul blob corrente:

Imports Microsoft.WindowsAzure.StorageClient

Public Class BlobServiceEventArgs
    Inherits EventArgs

    Private _blobUri As String
    Private _blob As CloudBlob

    Public ReadOnly Property BlobUri As String
        Get
            Return Me._blobUri
        End Get
    End Property

    Public ReadOnly Property Blob As CloudBlob
        Get
            Return _blob
        End Get
    End Property

    Public Sub New(ByVal blob As CloudBlob)
        Me._blobUri = blob.Uri.ToString
        Me._blob = blob
    End Sub
End Class

Così facendo siamo in grado di esporre il riferimento al blob e al suo indirizzo ai client che intercettano l'evento. Ora torniamo alla classe di servizio ed aggiungiamo i seguenti eventi:

    Public Event UploadBlobStarting(ByVal sender As ObjectByVal e As BlobServiceEventArgs)
    Public Event UploadBlobCompleted(ByVal sender As ObjectByVal e As BlobServiceEventArgs)
    Public Event DeleteBlobStarting(ByVal sender As ObjectByVal e As BlobServiceEventArgs)
    Public Event DeleteBlobCompleted(ByVal sender As ObjectByVal e As BlobServiceEventArgs)
    Public Event DownloadBlobStarting(ByVal sender As ObjectByVal e As BlobServiceEventArgs)
    Public Event DownloadBlobCompleted(ByVal sender As ObjectByVal e As BlobServiceEventArgs)

Gli eventi rappresentano l'inizio e la fine di attività inerenti il caricamento, il download e l'eliminazione di blob dallo storage. Dove andiamo a generare gli eventi? Il codice seguente mostra come modificare il metodo UploadBlobs indicando che la generazione dell'evento UploadBlobStarting deve avvenire appena prima dell'inizio dell'upload:

    Public Sub UploadBlobs(ByVal ContainerName As StringByVal BlobList As String())
        Try
            Dim container = blobStorage.GetContainerReference(ContainerName)

            For Each blob In BlobList
                Dim blobRef = container.GetBlobReference(IO.Path.GetFileName(blob))
                blobRef.Properties.ContentType = getMimeType(blob)
                blobRef.Properties.ContentLanguage = My.Computer.Info.InstalledUICulture.EnglishName

                RaiseEvent UploadBlobStarting(MeNew BlobServiceEventArgs(blobRef))
                Dim fs As New FileStream(blob, FileMode.Open)
                blobRef.BeginUploadFromStream(fs, AddressOf UploadAsyncCallBack, blobRef)
            Next
        Catch ex As Exception
            Throw
        End Try

    End Sub

Parimenti, nel delegate di callback possiamo generare l'evento UploadBlobCompleted:

    Private Sub UploadAsyncCallBack(ByVal result As IAsyncResult)
        If result.IsCompleted Then
            Dim blobref = CType(result.AsyncState, CloudBlob)
            blobref.SetProperties()
            blobref.EndUploadFromStream(result)
            RaiseEvent UploadBlobCompleted(MeNew BlobServiceEventArgs(blobRef))
        End If
    End Sub

L'operazione può essere ripetuta in modo analogo per i metodi di download ed eliminazione blob, inoltre si potrebbe prevedere un evento da scatenare nel caso in cui l'operazione fallisca. La cosa interessante da notare è che quando un evento viene scatenato viene passata l'istanza del blob le cui proprietà possono essere analizzate dai client chiamanti (che, ad esempio, possono così sapere quale blob è collegato all'evento).

Sebbene possano esserci ampi margini di miglioramento, l'impostazione data alla classe di servizio per l'accesso al Cloud Storage può dirsi completata. Nel prossimo post vedremo un piccolo esempio in WPF per utilizzare tale classe in modo effettivo sul lato client.

Alessandro

Print | posted on lunedì 17 gennaio 2011 17:29 | Filed Under [ Visual Basic Windows Azure and SQL Azure ]

Powered by:
Powered By Subtext Powered By ASP.NET