Migrer de WindowsAzure.Storage. ou Microsoft.Azure.Storage.Blob à Azure.Storage.Blobs

Il y a déjà quelque temps, Microsoft a déprécié la librairie WindowsAzure.Storage et encourager les utilisateurs à passer à Microsoft.Azure.Storage.Blob et pour finir Azure.Storage.Blobs. Si entre WindowsAzure.Storage et Microsoft.Azure.Storage.Blob il n’y a qu’un changement de namespaces, il n’en est pas de même pour passer à Azure.Storage.

Logo Microsoft Azure Blob Storage

Le cheminement n’est pas bien compliqué, mais il impose quelques modifications.

À noter que si vous voulez utiliser les Queues, ou File Shares, l’approche est similaire. La grande différence par rapport à WindowsAzure.Storage réside dans le fait que les namespaces ont été éclatés entre plusieurs librairies. Il faut maintenant référencer la librairie propre au service utilisé.

Après désinstallation de l’ancien package et installation du nouveau et suppression des anciens namespaces, il y a trois modifications notables :

  • La manière d’obtenir un client pour manipuler un conteneur.
  • La manière d’appliquer les droits d’accès au conteneur.
  • La manière d’obtenir un client pour manipuler un blob.

L’obtention du client du conteneur est grandement simplifiée.

Avant

/// <summary>
///  Get blob container
/// </summary>
/// <returns></returns>
private CloudBlobContainer GetBlogContainer()
{
    // Get the configuration
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(AzureStorageConnectionString);
    // Get a new client
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    // Get the container
    CloudBlobContainer container = blobClient.GetContainerReference(ContainerName);
    return container;
}

Après

/// <summary>
///  Get blob container
/// </summary>
/// <returns></returns>
private BlobContainerClient GetBlogContainer()
{
    // Get the container
    BlobContainerClient container = new BlobContainerClient(
            AzureStorageConnectionString,
            ContainerName);
    return container;
}

La création si besoin et l’application de la politique d’accès ne change pas beaucoup (le code s’appuie sur la méthode présentée ci-dessus).

Avant

var container = GetBlogContainer();

// Create if not exists
await container.CreateIfNotExistsAsync();

// Set permissions
await container.SetPermissionsAsync(
    new BlobContainerPermissions
    {
        PublicAccess = BlobContainerPublicAccessType.Container
    });

Après

var container = GetBlogContainer();

// Create if not exists
await container.CreateIfNotExistsAsync();

// Set permissions
await container.SetAccessPolicyAsync(PublicAccessType.BlobContainer);

L’Upload ou le Delete changent légèrement.

Avant

/// <summary>
/// Upload a file
/// </summary>
/// <param name="name"></param>
/// <param name="content"></param>
/// <returns></returns>
public async Task<Uri> Upload(String name, Byte[] content)
{
    // Get the blog by name
    CloudBlockBlob blob = GetBlogContainer().GetBlockBlobReference(name);

    // upload bytes
    await blob.UploadFromByteArrayAsync(content, 0, content.Length);

    // Return the blog uri
    return blob.Uri;
}

/// <summary>
/// Delete a file
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public async Task<Uri> Delete(String name)
{
    // Get the blog by name
    CloudBlockBlob blob = GetBlogContainer().GetBlockBlobReference(name);
    // upload bytes
    await blob.DeleteIfExistsAsync();

    // Return the blog uri
    return blob.Uri;
}

Après

/// <summary>
/// Upload a file
/// </summary>
/// <param name="name"></param>
/// <param name="content"></param>
/// <returns></returns>
public async Task<Uri> Upload(String name, Byte[] content)
{
    // Get the blog by name
    var blob = GetBlogContainer().GetBlobClient(name);
    
    // upload bytes
    await blob.UploadAsync(new MemoryStream(content));

    // Return the blog uri
    return blob.Uri;
}

/// <summary>
/// Delete a file
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public async Task<Uri> Delete(String name)
{
    // Get the blog by name
    var blob = GetBlogContainer().GetBlobClient(name);
    // upload bytes
    await blob.DeleteIfExistsAsync();

    // Return the blog uri
    return blob.Uri;
}

Conclusion

Voilà une migration simple et sans grand changement. C’est encore une fois la preuve qu’il est préférable d’effectuer ses migrations progressivement plutôt que d’avoir à faire le grand écart entre deux versions très différentes.

Jérémy Jeanson

Comments

You have to be logged in to comment this post.