In ogni applicazione che si rispetti, persistere i dati e le impostazioni è un requisito minimo che permette un utilizzo nel tempo dell'applicazione. Per compiere questo compito solitamente vengono sfruttati i file che in ambiente ASP.NET (server) o Windows (client) permettono di salvare qualsiasi informazione in formato binario, serializzando eventualmente gli oggetti.
In ambienti più limitati, come in Silverlight e Windows Phone, per ragioni di sicurezza non è concesso utilizzare liberamente le classi di System.IO, perché sostanzialmente non è possibile scrivere sul disco del PC o sullo storage del device. In realtà, anche nelle applicazioni Windows non è consentito scrivere in tutti i percorsi e spesso è stato, ed è, causa di malfunzionamenti di applicazioni che tentano di scrivere senza i requisiti necessari, pretendendo di funzionare con privilegi di amministratore.
Per risolvere questo problema e scaricare il problema della sicurezza, sin dal .NET Framework 1.0 sono presenti alcune classi, contenute nel namespace System.IO.IsolatedStorage, che permettono di identificare uno storage virtuale, dove è possibile leggere, scrivere file o gestire directory. La particolarità sta nel fatto che questo storage virtuale, sebbene poi fisicamente scriva sul file system del sistema, è completamente isolato a seconda del contesto in cui vive, garantendo la sicurezza e la tranquillità di accesso al suo contenuto.
Principi di IsolatedStorage
Il suo utilizzo è piuttosto semplice, perché molto simile alla normale creazione dei file, ma differisce solo dal modo in cui si ottiene lo Stream per la scrittura. Prima di tutto è necessario creare lo storage partendo dallo scopo che si vuole ottenere: a seconda dell'ambiente (WinForm, ASP.NET, Silverlight e Windows Phone) la classe IsolatedStorageFile dispone di metodi statici come GetUserStoreForApplication o GetUserStoreForSite (in WinForm si ha anche per dominio, per assembly, per utente o per macchina) che restituiscono un'istanza della classe stessa.// Ottengo lo storage per l'applicazione using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()) { // Operazioni sullo storage... }
Accesso al file system
Con la classe IsolatedStorageFile è possibile operare come se fosse un file system, con una serie di metodi come CreateDirectory, CreateFile, GetFileNames, MoveFile e tanti altri. Nell'esempio seguente si crea una cartella e si utilizza CreateFile per ottenere uno IsolatedStorageFileStream (una specializzazione di Stream) che permette di scrivere nel file attraverso gli strumenti standard di manipolazione dello Stream (StreamWriter, StreamReader, BinaryReader, BinaryWriter ecc).// Creo una cartella if (!storage.DirectoryExists("mydir")) storage.CreateDirectory("mydir"); // Creo il file (sovrascrivo se esiste) using (IsolatedStorageFileStream stream = storage.CreateFile("mydir\\test.txt")) { // Scrivo nello Stream byte[] data = Encoding.Unicode.GetBytes("Ciao mondo!"); stream.Write(data, 0, data.Length); }
Grazie a questo storage l'utente ha la garanzia della sicurezza delle informazioni, perché in ambienti come Silverlight è possibile controllarlo e svuotarlo. In Windows Phone, ad esempio, viene cancellato con la rimozione dell'applicazione.
Occorre precisare che lo spazio non è infinito, ma esiste una quota iniziale (di 1 MB su Silverlight, 50 MB su Silverlight se l'applicazione viene installata, 2 GB su Windows Phone) che è possibile conoscere con la proprietà Quota, così come aumentare con il metodo IncreaseQuotaTo.
Infine, sebbene non esistano strumenti ufficiali su Silverlight e Windows Phone che permettano di avere un motore relazionale, esistono soluzioni di terze parti che forniscono motori relazionali basati sull'isolated storage. La persistenza dei dati binaria, infatti, permette di gestire liberamente il modo in cui un layer sovrastante possa leggere e scrivere i byte.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Miglioramenti nelle performance di Angular 16
Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati
Usare le variabili per personalizzare gli stili CSS
Utilizzare domini personalizzati gestiti automaticamente con Azure Container Apps
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Usare le collection expression per inizializzare una lista di oggetti in C#
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes
Implementare il throttling in ASP.NET Core
Applicare il versioning ai nostri endpoint ASP.NET Core Minimal API
Gestire errori funzionali tramite exception in ASP.NET Core Web API
Accesso sicuro ai secrets attraverso i file in Azure Container Apps
Utilizzare gli snapshot con Azure File shares