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
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Creare un'applicazione React e configurare Tailwind CSS
Paginare i risultati con QuickGrid in Blazor
Triggerare una pipeline su un altro repository di Azure DevOps
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Usare le navigation property in QuickGrid di Blazor
.NET Conference Italia 2024
Utilizzare un service principal per accedere a Azure Container Registry
Sostituire la GitHub Action di login su private registry
Utilizzare Tailwind CSS all'interno di React: primi componenti
Cambiare la chiave di partizionamento di Azure Cosmos DB
Migliora le tue soluzioni ASP.NET Core con Azure OpenAI
I più letti di oggi
- Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
- Creare una libreria CSS universale: Cards
- Eseguire script pre e post esecuzione di un workflow di GitHub