CRUD en una Azure Storage Blob Cool con C#

Tercer capítulo de la serie de UniversalSync, en donde voy describiendo paso a paso el desarrollo de la aplicación definitiva de Backup de mi material multimedia (vídeos y fotos) en el Cloud.

En el capítulo anterior he dado de alta un proyecto en Visual Studio 2015 (he obviado todo lo relacionado a DevOps) y ahora voy a picar código.

Lo primero que quiero que hacer es construir un proyecto del tipo librería de Clases, porque quiero aplicar un cuasi TDD, y seguir a rajatabla el concepto de KISS. Osea, ser meticuloso con no escribir ni una línea de código que no necesite. Ya llegará el momento de meter interfaces, patrones, IOC y, finálmente, microservicios.

Conectando, que es gerundio

Bueno, voy a empezar a picar. Y lo primero es hacer el Test que me confirme que estoy conectando o construyendo el Contenedor de Blobs de forma correcta.

         [TestMethod()]
        public void CreateTest()
        {
            var referencia = "juanquijano";
            var blobcontainer = new BlobContanier();

            CloudBlobContainer blob = blobcontainer.Create();

            Assert.IsNotNull(blob);
            Assert.AreEqual(referencia, blob.Name);
        }

 

El código de la clase que cubre el test es muy sencillo (hasta que funciona claro).

    public class BlobContanier
    {
        public CloudBlobContainer Create()
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("juanquijano");

            return container;
        }
    }
 

Aquí hay que tener en cuenta varias cosas. La primera es que la cadena de conexión está almacenada en un fichero app.config con el siguiente formato:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=universalsyncblobcool;AccountKey=bSOOU+TFCbA/aKlkI5HHpBVnfZ2/UMX1B/R++"/>
  </appSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
  </startup>
</configuration>

Fíjate que los valores “AccountName” y “Key” los debes buscar en el portal de Azure, en los settings de tu cuenta de almacenamiento. También se podría hacer por PowerShell, pero eso supera el alcance de este post.

Azure_account_keys.jpg

Una cosa que me apuntado para corregir en el futuro, es que he metido “a fuego” el nombre del contenedor que quiero utilizar. Lo suyo es que esto esté en el app.config, ya que me obliga hacerlo mal también en el test.

Relacionado con esto, recuerda que debes duplicar el app.config en el proyecto de Test o este no va a encontrar los valores y va a fallar  (otra cosa a solucionar es que haya un solo app.config para el proyecto y sus test).

Por último, lo que no he probado aún es si la propia librería crea el Contenedor si este no existe, o lo tengo que hacer a mano.

Pero lo importante es que a estas alturas, el test dá verde.

Operaciones con un fichero contra el Blob

Ahora voy a abordar lo más sencillo: el grabar y borrar ficheros en el Blob. Para ello lo más sencillo es comprobar si el fichero existe. Por lo cual me han salido los tres siguientes test.

        [TestMethod()]
        public void PutTest()
        {
            var Blob = new Blob();
            var objeto = File.OpenRead(@"..\..\20160514_195832.jpg";);
            var fileName = Path.GetFileName(objeto.Name);

            Blob.Put(objeto);
            objeto.Close();

            Assert.IsTrue(Blob.Exist(fileName));
        }
        [TestMethod()]
        public void ExistTest()
        {
            var Blob = new Blob();
            var fileName = "20160514_195832.jpg";

            Blob.Exist(fileName);

            Assert.IsTrue(true);
        }
        [TestMethod()]
        public void DeleteTest()
        {
            var Blob = new Blob();
            var fileName = "20160514_195832.jpg";

            Blob.Delete(fileName);

            Assert.IsFalse(Blob.Exist(fileName));
        }

Lo cual comprueba que funciona corréctamente la clase Blob:

    public class Blob
    {
        public void Put(FileStream objeto)
        {
            var fichero = Path.GetFileName(objeto.Name);

            var container = new BlobContanier().Create();
            var blob = container.GetBlockBlobReference(fichero);

            blob.UploadFromStream(objeto);
        }
        public Boolean Exist(string fileName)
        {
            var container = new BlobContanier().Create();
            var blob = container.GetBlockBlobReference(fileName);

            return blob.Exists();
        }

        public async Task<Boolean>; Delete(string fileName)
        {
            var container = new BlobContanier().Create();
            var blob = container.GetBlockBlobReference(fileName);
            return await blob.DeleteIfExistsAsync();
        }
    }

Y otra vez, tengo todo en verde y funcionando.

De hecho, me he bajado e instalado el Microsoft Azure Storage Explorer, y he podido comprobar que todo está correcto.

Ahora, el siguiente paso es montar la clase para grabar tanto en Table como en File, a ver qué diferencias hay. Y más adelante preparar la recuperación.

Espero que sea de utilidad, no vemos en el siguiente capítulo.

Anuncios

Un comentario en “CRUD en una Azure Storage Blob Cool con C#

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s