Gli storage di Windows Azure (table, queue, e blob) sono pensati per scalare e supportare grossi carichi di lavoro e hanno la caratteristica principale di poter essere consumati tramite chiamate REST, cioè interamente con chiamate HTTP. Questo li rende facili da usare con qualsiasi tecnologia o piattaforma tra cui anche Silverlight che, grazie alle classi WebClient e WebRequest, permette di effettuare upload, query a tabelle, popolare o smaltire code.
Nello sfruttare Windows Azure si incappa però in un problema tipico di Silverlight: l'accesso cross domain. Gli storage infatti risiedono solitamente sul dominio [nome].blob.core.windows.net mentre l'applicazione internet, o più in generale dove risiede lo XAP risiede su un dominio internet diverso. Questo significa che le chiamate viaggiano tra due dominio diversi e il client Silverlight cercherà i file clientaccesspolicy.xml o crossdomain.xml, come richiesto dalle specifiche per verificare se il chiamante può effettuare l'operazione.
Purtroppo i blob sono raggruppati in container, oggetti paragonabili a macro cartelle e quindi apparentemente non è possibile caricare file alla radice del dominio. Fortunatamente esiste un container speciale, di nome $root che rappresenta la radice del dominio. Nel codice seguente si sfruttano quindi le API managed da utilizzare in una console application per poter caricare il file clientaccesspolicy.xml.
// Creo il client REST CloudStorageAccount account = CloudStorageAccount.Parse("DefaultEndpointsProtocol=http;AccountName=test;AccountKey=key"); CloudBlobClient client = account.CreateCloudBlobClient(); // Creo il container $root CloudBlobContainer container = client.GetContainerReference("$root"); container.CreateIfNotExist(); // Imposto i permessi container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); // Carico il file xml CloudBlockBlob page = container.GetBlockBlobReference("clientaccesspolicy.xml"); page.UploadFile(@"c:\temp\clientaccesspolicy.xml");
Nello snippet precedente si carica il file e, di particolare importanza, si rende pubblico l'accesso in sola lettura ai blob tramite il metodo SetPermissions, consentendo a chiunque di poter scaricare il file. Per concludere, il container $root purtroppo non è disponibile.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare QuickGrid di Blazor con Entity Framework
Utilizzare gRPC su App Service di Azure
Creare una libreria CSS universale: Clip-path
Utilizzare WhenEach per processare i risultati di una lista di task
Filtering sulle colonne in una QuickGrid di Blazor
Migliorare l'organizzazione delle risorse con Azure Policy
Ordine e importanza per @layer in CSS
Gestire i dati con Azure Cosmos DB Data Explorer
Fissare una versione dell'agent nelle pipeline di Azure DevOps
Estrarre dati randomici da una lista di oggetti in C#
Usare le navigation property in QuickGrid di Blazor