Almacenamiento y acceso a datos en Azure Storage desdeXamarin.Forms
Azure Storage es una solución escalable de almacenamiento en la nube que se puede usar para almacenar datos estructurados y no estructurados. En este artículo se muestra cómo usar para almacenar datos binarios y de texto en Azure Storage y cómo Xamarin.Forms acceder a los datos.
Azure Storage proporciona cuatro servicios de almacenamiento:
- Blob Storage. Un blob puede ser texto o datos binarios, como copias de seguridad, máquinas virtuales, archivos multimedia o documentos.
- Table Storage es un almacén de clave-atributo NoSQL.
- Queue Storage es un servicio de mensajería para el procesamiento de flujo de trabajo y la comunicación entre servicios en la nube.
- File Storage proporciona almacenamiento compartido mediante el protocolo SMB.
Existen dos tipos de cuentas de almacenamiento:
- Una cuenta de almacenamiento de uso general proporciona acceso a Azure Storage servicios desde una sola cuenta.
- Una cuenta de Blob Storage es una cuenta de almacenamiento especializada para almacenar blobs. Este tipo de cuenta se recomienda cuando solo necesita almacenar datos de blobs.
En este artículo, junto con la aplicación de ejemplo, se muestra cómo cargar archivos de imagen y texto en Blob Storage y descargarlos. Además, también muestra cómo recuperar una lista de archivos del almacenamiento de blobs y eliminar archivos.
Para obtener más información sobre Azure Storage, vea Introducción a Storage.
Nota:
Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Introducción a Blob Storage
Blob Storage consta de tres componentes, que se muestran en el diagrama siguiente:

Todo el acceso a Azure Storage a través de una cuenta de almacenamiento. Una cuenta de almacenamiento puede contener un número ilimitado de contenedores y un contenedor puede almacenar un número ilimitado de blobs, hasta el límite de capacidad de la cuenta de almacenamiento.
Un blob es un archivo de cualquier tipo y tamaño. Azure Storage admite tres tipos de blob diferentes:
- Los blobs en bloques están optimizados para el streaming y el almacenamiento de objetos en la nube, y son una buena opción para almacenar copias de seguridad, archivos multimedia, documentos, etc. Los blobs en bloques pueden tener un tamaño de hasta 195 Gb.
- Los blobs en anexos son similares a los blobs en bloques, pero están optimizados para operaciones de anexado, como el registro. Los blobs en anexos pueden tener un tamaño de hasta 195 Gb.
- Los blobs en páginas están optimizados para operaciones de lectura y escritura frecuentes y normalmente se usan para almacenar máquinas virtuales y sus discos. Los blobs en páginas pueden tener un tamaño de hasta 1 Tb.
Nota:
Tenga en cuenta que las cuentas de Blob Storage admiten blobs en bloques y anexos, pero no en blobs en páginas.
Un blob se carga en Azure Storage y se descarga desde Azure Storage, como una secuencia de bytes. Por lo tanto, los archivos se deben convertir en una secuencia de bytes antes de la carga y volver a convertir a su representación original después de la descarga.
Todos los objetos almacenados en Azure Storage tienen una dirección URL única. El nombre de la cuenta de almacenamiento forma el subdominio de esa dirección y la combinación de subdominio y nombre de dominio constituye un punto de conexión para la cuenta de almacenamiento. Por ejemplo, si la cuenta de almacenamiento se denomina mystorageaccount, el punto de conexión de blob predeterminado para la cuenta de almacenamiento es .
La dirección URL para el acceso a un objeto en una cuenta de almacenamiento se crea anexando la ubicación del objeto en la cuenta de almacenamiento al extremo. Por ejemplo, una dirección de blob tendrá el formato https://mystorageaccount.blob.core.windows.net/mycontainer/myblob .
Configurar
El proceso para integrar una cuenta Azure Storage en una Xamarin.Forms aplicación es el siguiente:
- Cree una cuenta de almacenamiento. Para obtener más información, consulte Creación de una cuenta de almacenamiento.
- Agregue la Azure Storage cliente a la aplicación.
- Configure la cadena de conexión de almacenamiento. Para obtener más información, vea Conectarse a Azure Storage.
- Agregue
usingdirectivas para los espacios de nombres y a las clases queMicrosoft.WindowsAzure.StorageMicrosoft.WindowsAzure.Storage.Blobtendrán acceso a Azure Storage.
Conexión a Azure Storage
Todas las solicitudes realizadas en los recursos de la cuenta de almacenamiento deben autenticarse. Aunque los blobs se pueden configurar para admitir la autenticación anónima, hay dos enfoques principales que una aplicación puede usar para autenticarse con una cuenta de almacenamiento:
- Clave compartida. Este enfoque usa el nombre Azure Storage cuenta y la clave de cuenta para acceder a los servicios de almacenamiento. A una cuenta de almacenamiento se le asignan dos claves privadas al crearse que se pueden usar para la autenticación de claves compartidas.
- Firma de acceso compartido. Se trata de un token que se puede anexar a una dirección URL que permite el acceso delegado a un recurso de almacenamiento, con los permisos que especifica, durante el período de tiempo que es válido.
Se pueden especificar cadenas de conexión que incluyan la información de autenticación necesaria para acceder Azure Storage recursos desde una aplicación. Además, se puede configurar una cadena de conexión para conectarse al emulador de Almacenamiento de Azure desde Visual Studio.
Nota:
Azure Storage admite HTTP y HTTPS en una cadena de conexión. Sin embargo, se recomienda usar HTTPS.
Conexión al Azure Storage Emulator
El emulador de Azure Storage proporciona un entorno local que emula los servicios de blob, cola y tabla de Azure con fines de desarrollo.
Se debe usar la siguiente cadena de conexión para conectarse al emulador de Azure Storage:
UseDevelopmentStorage=true
Para más información sobre el emulador de Azure Storage, consulte Uso del emulador de Azure Storage para desarrollo y pruebas.
Conexión a Azure Storage mediante una clave compartida
El siguiente formato de cadena de conexión debe usarse para conectarse a Azure Storage con una clave compartida:
DefaultEndpointsProtocol=[http|https];AccountName=myAccountName;AccountKey=myAccountKey
myAccountName debe reemplazarse por el nombre de la cuenta de almacenamiento y debe myAccountKey reemplazarse por una de las dos claves de acceso de la cuenta.
Nota:
Al usar la autenticación de clave compartida, el nombre de la cuenta y la clave de cuenta se distribuirán a cada persona que use la aplicación, lo que proporcionará acceso de lectura y escritura completo a la cuenta de almacenamiento. Por lo tanto, use la autenticación de clave compartida solo con fines de prueba y nunca distribuya las claves a otros usuarios.
Conexión a Azure Storage mediante una firma de acceso compartido
El siguiente formato de cadena de conexión debe usarse para conectarse a Azure Storage con una SAS:
BlobEndpoint=myBlobEndpoint;SharedAccessSignature=mySharedAccessSignature
myBlobEndpoint debe reemplazarse por la dirección URL del punto de conexión de blob y mySharedAccessSignature debe reemplazarse por la SAS. La SAS proporciona el protocolo, el punto de conexión de servicio y las credenciales para acceder al recurso.
Nota:
Se recomienda la autenticación de SAS para aplicaciones de producción. Sin embargo, en una aplicación de producción, la SAS debe recuperarse de un servicio back-end a petición, en lugar de agruparse con la aplicación.
Para obtener más información sobre las firmas de acceso compartido, consulte Uso de firmas de acceso compartido (SAS).
Creación de un contenedor
El método se usa para recuperar una referencia a un contenedor con nombre, que luego se puede usar para recuperar blobs del contenedor o para agregar GetContainer blobs al contenedor. El siguiente ejemplo de código muestra el método GetContainer:
static CloudBlobContainer GetContainer(ContainerType containerType)
{
var account = CloudStorageAccount.Parse(Constants.StorageConnection);
var client = account.CreateCloudBlobClient();
return client.GetContainerReference(containerType.ToString().ToLower());
}
El CloudStorageAccount.Parse método analiza una cadena de conexión y devuelve una instancia de que representa la cuenta de CloudStorageAccount almacenamiento. A continuación, el método crea una instancia de , que se usa para recuperar CloudBlobClient contenedores y CreateCloudBlobClient blobs. El método recupera el contenedor especificado como una instancia de , antes de GetContainerReference que se devuelva al método que realiza la CloudBlobContainer llamada. En este ejemplo, el nombre del contenedor es el valor ContainerType de enumeración, convertido en una cadena en minúsculas.
Nota:
Los nombres de contenedor deben estar en minúsculas y deben comenzar por una letra o un número. Además, solo pueden contener letras, números y el carácter de guión, y deben tener entre 3 y 63 caracteres.
El GetContainer método se invoca de la siguiente manera:
var container = GetContainer(containerType);
A CloudBlobContainer continuación, la instancia se puede usar para crear un contenedor si aún no existe:
await container.CreateIfNotExistsAsync();
De forma predeterminada, un contenedor recién creado es privado. Esto significa que se debe especificar una clave de acceso de almacenamiento para recuperar blobs del contenedor. Para obtener información sobre cómo hacer públicos los blobs dentro de un contenedor, consulte Creación de un contenedor.
Carga de datos en un contenedor
El método se usa para cargar un flujo de datos de bytes en UploadFileAsync Blob Storage y se muestra en el ejemplo de código siguiente:
public static async Task<string> UploadFileAsync(ContainerType containerType, Stream stream)
{
var container = GetContainer(containerType);
await container.CreateIfNotExistsAsync();
var name = Guid.NewGuid().ToString();
var fileBlob = container.GetBlockBlobReference(name);
await fileBlob.UploadFromStreamAsync(stream);
return name;
}
Después de recuperar una referencia de contenedor, el método crea el contenedor si aún no existe. A continuación, se crea un nuevo objeto para que actúe como un nombre de blob único y se recupera una referencia a bloques de Guid blobs como CloudBlockBlob instancia. A continuación, el flujo de datos se carga en el blob mediante el método , que crea el blob si aún no existe o lo sobrescribe si UploadFromStreamAsync existe.
Para poder cargar un archivo en Blob Storage mediante este método, primero debe convertirse en una secuencia de bytes. Esto se muestra en el ejemplo de código siguiente:
var byteData = Encoding.UTF8.GetBytes(text);
uploadedFilename = await AzureStorage.UploadFileAsync(ContainerType.Text, new MemoryStream(byteData));
Los text datos se convierten en una matriz de bytes, que luego se encapsula como una secuencia que se pasa al UploadFileAsync método .
Descarga de datos de un contenedor
El GetFileAsync método se usa para descargar datos de blob de Azure Storage y se muestra en el ejemplo de código siguiente:
public static async Task<byte[]> GetFileAsync(ContainerType containerType, string name)
{
var container = GetContainer(containerType);
var blob = container.GetBlobReference(name);
if (await blob.ExistsAsync())
{
await blob.FetchAttributesAsync();
byte[] blobBytes = new byte[blob.Properties.Length];
await blob.DownloadToByteArrayAsync(blobBytes, 0);
return blobBytes;
}
return null;
}
Después de recuperar una referencia de contenedor, el método recupera una referencia de blob para los datos almacenados. Si el blob existe, el método recupera sus FetchAttributesAsync propiedades. Se crea una matriz de bytes del tamaño correcto y el blob se descarga como una matriz de bytes que se devuelve al método de llamada.
Después de descargar los datos de bytes del blob, se deben convertir a su representación original. Esto se muestra en el ejemplo de código siguiente:
var byteData = await AzureStorage.GetFileAsync(ContainerType.Text, uploadedFilename);
string text = Encoding.UTF8.GetString(byteData);
El método recupera la matriz de bytes de Azure Storage, antes de que se convierta de nuevo GetFileAsync en una cadena codificada en UTF8.
Enumerar datos en un contenedor
El método se usa para recuperar una lista de blobs almacenados en un GetFilesListAsync contenedor y se muestra en el ejemplo de código siguiente:
public static async Task<IList<string>> GetFilesListAsync(ContainerType containerType)
{
var container = GetContainer(containerType);
var allBlobsList = new List<string>();
BlobContinuationToken token = null;
do
{
var result = await container.ListBlobsSegmentedAsync(token);
if (result.Results.Count() > 0)
{
var blobs = result.Results.Cast<CloudBlockBlob>().Select(b => b.Name);
allBlobsList.AddRange(blobs);
}
token = result.ContinuationToken;
} while (token != null);
return allBlobsList;
}
Después de recuperar una referencia de contenedor, el método usa el método del contenedor para recuperar referencias a ListBlobsSegmentedAsync los blobs dentro del contenedor. Los resultados devueltos ListBlobsSegmentedAsync por el método se enumeran mientras que la instancia de no es BlobContinuationTokennull . Cada blob se convierte desde el devuelto a para acceder a la propiedad del blob, antes de que su valor se IListBlobItemCloudBlockBlob agrega a la NameallBlobsList colección. Una vez que la instancia es , se ha devuelto el último BlobContinuationToken nombre de blob y la ejecución sale del null bucle.
Eliminación de datos de un contenedor
El DeleteFileAsync método se usa para eliminar un blob de un contenedor y se muestra en el ejemplo de código siguiente:
public static async Task<bool> DeleteFileAsync(ContainerType containerType, string name)
{
var container = GetContainer(containerType);
var blob = container.GetBlobReference(name);
return await blob.DeleteIfExistsAsync();
}
Después de recuperar una referencia de contenedor, el método recupera una referencia de blob para el blob especificado. A continuación, el blob se elimina con el DeleteIfExistsAsync método .
Descarga del ejemplo