Silverlight - Almacenamiento aislado
El tercer mecanismo de acceso a archivos es Isolated Storagemecanismo, que proporciona almacenamiento asociado con el usuario que inició sesión. La API presenta datos a través delStream clase de .NET System.IOespacio de nombres. Por tanto, al igual que con los otros mecanismos que hemos analizado hasta ahora, puede utilizar los otros tipos enSystem.IO para trabajar con los flujos, lo que le permite almacenar datos textuales o binarios.
Algunas características importantes son:
Este mecanismo de almacenamiento se llama Isolated Storage porque la tienda está dividida y una aplicación Silverlight tiene acceso solo a ciertas partes.
No puede acceder a ningún dato almacenado antiguo. En primer lugar, la tienda está dividida por usuario. Una aplicación de Silverlight no puede obtener acceso a la tienda para un usuario diferente al que inició sesión y ejecuta la aplicación.
Esto no tiene nada que ver con ningún mecanismo de identificación que pueda utilizar su aplicación web. Ese es un punto importante para recordar porque algunas personas que comparten computadoras no se molestan en tener cuentas separadas de Windows y están acostumbradas a iniciar y cerrar sesión en los sitios web que utilizan.
Uso de almacenamiento aislado
El almacenamiento aislado no es exclusivo de Silverlight. La API se introdujo originalmente paraWindows Formspara permitir que las aplicaciones lanzadas desde la web almacenen datos localmente en escenarios de confianza parcial. La implementación es diferente y no hay forma de acceder a la.NET Framework de almacenamiento aislado de Silverlight, o viceversa.
Sin embargo, si lo ha utilizado, los pasos aquí le resultarán muy familiares.
Empiece preguntando por la tienda específica del usuario. En este caso, estamos solicitando el de la aplicación. Si quisiéramos que la tienda por sitio sea compartida por todos los XAP en el sitio, llamaríamosGetUserStoreForSite en lugar.
Cualquiera de los métodos devuelve un IsolatedStorageFile object, que es un nombre bastante inútil ya que representa un directorio, no un archivo.
Para acceder a un archivo, debe preguntar al IsolatedStorageFile para Stream.
Usamos el IsolatedStorageFileStream clase, y su constructor requiere que pase la IsolatedStorageFile objeto como argumento.
Entonces estamos creando un nuevo archivo en la tienda. Se desconoce la ubicación exacta del archivo en el disco.
El directorio contenedor tiene elementos aleatorios para que sea imposible adivinar el nombre del archivo.
Sin esto, es posible que los sitios web maliciosos coloquen un archivo en la computadora del usuario y luego construyan una URL de archivo para abrirlo, con la esperanza de engañar al usuario para que haga clic en un enlace que ejecuta un programa localmente.
Hay varias otras salvaguardas integradas en Windows que intentan evitar que esto suceda, pero esta es otra capa de defensa en caso de que las otras hayan sido deshabilitadas o omitidas de alguna manera.
El archivo se almacenará en algún lugar dentro del perfil del usuario, pero eso es todo lo que puede saber al respecto. TuIsolatedStorageFileStream no informará su verdadera ubicación.
Echemos un vistazo a un ejemplo simple que rastrea cuántas veces se ha ejecutado la aplicación. A continuación se muestra el código XAML.
<UserControl x:Class = "StoreRunCount.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "400">
<Grid x:Name = "LayoutRoot" Background = "White">
<TextBlock x:Name = "runCountText" FontSize = "20" />
</Grid>
</UserControl>
Aquí está el código C # en el que Isolated storage son usados.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO.IsolatedStorage;
using System.IO;
namespace StoreRunCount {
public partial class MainPage : UserControl {
const string RunCountFileName = "RunCount.bin";
public MainPage() {
InitializeComponent();
int runCount = 0;
using (var store = IsolatedStorageFile.GetUserStoreForApplication()) {
if (store.FileExists(RunCountFileName)) {
using (var stm = store.OpenFile(RunCountFileName,
FileMode.Open, FileAccess.Read))
using (var r = new BinaryReader(stm)) {
runCount = r.ReadInt32();
}
}
runCount += 1;
using (var stm = store.OpenFile(RunCountFileName,
FileMode.Create, FileAccess.Write))
using (var w = new BinaryWriter(stm)) {
w.Write(runCount);
}
}
runCountText.Text = "You have run this application " + runCount.ToString() + " time(s)";
}
}
}
Cuando se compile y ejecute el código anterior, verá la siguiente página web que le mostrará cuántas veces ejecuta esta aplicación.
Aumento de su cuota
Las solicitudes pueden solicitar más espacio si la cantidad inicial es insuficiente por alguna razón. No hay garantía de que la solicitud se realice correctamente. Silverlight preguntará al usuario si está dispuesto a conceder más espacio a la aplicación.
Por cierto, solo puede solicitar más almacenamiento en respuesta a la entrada del usuario, como un click. Si intenta preguntarlo en otro momento, como cuando se carga el complemento, o en un controlador de temporizador, Silverlight fallará automáticamente la solicitud sin siquiera preguntarle al usuario. La cuota adicional solo está disponible para las aplicaciones con las que el usuario está interactuando.
los IsolatedStorageFile El objeto proporciona tres miembros para administrar la cuota:
- AvailableFreeSpace
- IncreaseQuotaTo
- Quota
DisponibleFreeSpace
La propiedad AvailableFreeSpace le dice cuánto de su cuota permanece libre.
Tenga en cuenta que incluso un subdirectorio vacío consume parte de su cuota porque el sistema operativo necesita asignar espacio en el disco para representar el directorio. Por lo tanto, el espacio disponible puede ser menor que la cuota total, menos el tamaño total de todos sus archivos.
IncreaseQuotaTo
Si no tiene suficiente espacio para continuar, solicite más llamando al IncreaseQuotaTo método.
Cuota
Aquí estamos usando la tercera propiedad, Quota, para descubrir el tamaño de la cuota actual, y luego agregamos la cantidad adicional que necesitamos para obtener nuestra nueva cuota solicitada.
El método devuelve True o Falsepara indicar si tenemos asignado lo que pedimos. Tenga en cuenta que Silverlight puede decidir asignar más espacio del que solicitó.
Aquí hay un ejemplo simple para aumentar la quota, cuando se hace clic en el botón. A continuación se muestra el código XAML.
<UserControl x:Class = "ChangeQuota.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "400">
<Grid x:Name = "LayoutRoot" Background = "White">
<TextBlock x:Name = "infoText" FontSize = "20" TextWrapping = "Wrap" />
<Button x:Name = "increaseQuota" Content = "Increase" HorizontalAlignment = "Center"
FontSize = "20"
VerticalAlignment = "Center" Click = "increaseQuota_Click" />
</Grid>
</UserControl>
Aquí está la implementación de click evento en el que se aumenta la cuota.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO.IsolatedStorage;
namespace ChangeQuota {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void increaseQuota_Click(object sender, RoutedEventArgs e) {
using (IsolatedStorageFile isoStore =
IsolatedStorageFile.GetUserStoreForApplication()) {
long newQuota = isoStore.Quota + 10240;
if (isoStore.IncreaseQuotaTo(newQuota)) {
infoText.Text = "Quota is " + isoStore.Quota + ", free space: " +
isoStore.AvailableFreeSpace;
} else {
infoText.Text = "Meanie!";
}
}
}
}
}
Cuando se compile y ejecute el código anterior, verá el siguiente resultado.
Cuando haces clic Increase, aparece el mensaje. Pide aumentar elQuota ser 10 KB más grande de lo que ya es.
Cuando haces clic Yes, luego imprime la cantidad de Cuota disponible.
Le recomendamos que ejecute los ejemplos anteriores para una mejor comprensión.