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 il metodo Chunk per creare blocchi di oggetti di uguali dimensioni partendo da una lista
Migrare un repository git da Azure DevOps a GitHub
Leggere i dati di configurazione di ASP.NET Core da Azure Key Vault
Effettuare test di carico con Azure Load Testing
Produrre un inventario automatico di Azure Storage
Commentare una issue associata ad una pull request tramite un workflow di GitHub
ChatOps con GitHub
Utilizzare la libreria EntityFrameworkCore.Exceptions per gestire le eccezioni di Entity Framework Core in modo tipizzato
Aggiungere le issue di più repository in una board in GitHub
Definire una tabella come memory optimized su Sql Server tramite EF Core
Migrare un progetto ASP.NET Core da .NET 6 a .NET 7
Eseguire query in parallelo con Entity Framework Core and ASP.NET Core
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Gestire il breaking change di Entity Framework Core 7 con tabelle che usano identity e trigger
- Raggruppare i parametri di una minimal API in un singolo oggetto in ASP.NET Core
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Speciale Visual Studio 2013 e .NET Framework 4.5.1: One ASP.NET, Windows 8.1, Entity Framework 6