Créer et répertorier des versions d’objets blob dans .NET
Le contrôle de version des objets blob crée automatiquement une version précédente d’un objet blob chaque fois qu’il est modifié ou supprimé. Lorsque le contrôle de version est activé, vous pouvez alors restaurer une version antérieure d’un objet blob pour récupérer vos données si celles-ci ont été modifiées ou supprimées par erreur.
Pour une protection des données optimale, Microsoft recommande d’activer le contrôle de version et la suppression réversible d’objets blob pour votre compte de stockage. Pour plus d’informations, consultez Contrôle de version des objets blob et Suppression réversible pour les objets blob.
Modifier un objet blob pour déclencher une nouvelle version
L’exemple de code suivant montre comment déclencher la création d’une nouvelle version avec la bibliothèque cliente Stockage Microsoft Azure pour .NET version 12.5.1 ou ultérieure. Avant d’exécuter cet exemple, assurez-vous que vous avez activé le contrôle de version pour votre compte de stockage.
L’exemple crée un objet blob de blocs, puis met à jour les métadonnées de cet objet. La mise à jour des métadonnées de l’objet blob déclenche la création d’une nouvelle version. L’exemple récupère la version initiale et la version actuelle, et indique que seule la version actuelle contient les métadonnées.
public static async Task UpdateVersionedBlobMetadata(BlobContainerClient blobContainerClient,
string blobName)
{
try
{
// Create the container.
await blobContainerClient.CreateIfNotExistsAsync();
// Upload a block blob.
BlockBlobClient blockBlobClient = blobContainerClient.GetBlockBlobClient(blobName);
string blobContents = string.Format("Block blob created at {0}.", DateTime.Now);
byte[] byteArray = Encoding.ASCII.GetBytes(blobContents);
string initalVersionId;
using (MemoryStream stream = new MemoryStream(byteArray))
{
Response<BlobContentInfo> uploadResponse =
await blockBlobClient.UploadAsync(stream, null, default);
// Get the version ID for the current version.
initalVersionId = uploadResponse.Value.VersionId;
}
// Update the blob's metadata to trigger the creation of a new version.
Dictionary<string, string> metadata = new Dictionary<string, string>
{
{ "key", "value" },
{ "key1", "value1" }
};
Response<BlobInfo> metadataResponse =
await blockBlobClient.SetMetadataAsync(metadata);
// Get the version ID for the new current version.
string newVersionId = metadataResponse.Value.VersionId;
// Request metadata on the previous version.
BlockBlobClient initalVersionBlob = blockBlobClient.WithVersion(initalVersionId);
Response<BlobProperties> propertiesResponse = await initalVersionBlob.GetPropertiesAsync();
PrintMetadata(propertiesResponse);
// Request metadata on the current version.
BlockBlobClient newVersionBlob = blockBlobClient.WithVersion(newVersionId);
Response<BlobProperties> newPropertiesResponse = await newVersionBlob.GetPropertiesAsync();
PrintMetadata(newPropertiesResponse);
}
catch (RequestFailedException e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
throw;
}
}
static void PrintMetadata(Response<BlobProperties> propertiesResponse)
{
if (propertiesResponse.Value.Metadata.Count > 0)
{
Console.WriteLine("Metadata values for version {0}:", propertiesResponse.Value.VersionId);
foreach (var item in propertiesResponse.Value.Metadata)
{
Console.WriteLine("Key:{0} Value:{1}", item.Key, item.Value);
}
}
else
{
Console.WriteLine("Version {0} has no metadata.", propertiesResponse.Value.VersionId);
}
}
Répertorier les versions de blob
Pour répertorier les versions des objets blob, spécifiez le paramètre BlobStates avec le champ Version. Les versions sont répertoriées du plus ancien au plus récent.
L’exemple de code suivant montre comment lister les versions de blob.
private static void ListBlobVersions(BlobContainerClient blobContainerClient,
string blobName)
{
try
{
// Call the listing operation, specifying that blob versions are returned.
// Use the blob name as the prefix.
var blobVersions = blobContainerClient.GetBlobs
(BlobTraits.None, BlobStates.Version, prefix: blobName)
.OrderByDescending(version => version.VersionId).Where(blob => blob.Name == blobName);
// Construct the URI for each blob version.
foreach (var version in blobVersions)
{
BlobUriBuilder blobUriBuilder = new BlobUriBuilder(blobContainerClient.Uri)
{
BlobName = version.Name,
VersionId = version.VersionId
};
if ((bool)version.IsLatestVersion.GetValueOrDefault())
{
Console.WriteLine("Current version: {0}", blobUriBuilder);
}
else
{
Console.WriteLine("Previous version: {0}", blobUriBuilder);
}
}
}
catch (RequestFailedException e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
throw;
}
}
Copier une version précédente de l’objet blob sur l’objet blob de base
Vous pouvez effectuer une opération de copie pour promouvoir une version par rapport son objet blob de base, tant que l’objet blob de base se trouve dans un niveau en ligne (chaud ou froid). La version est conservée, mais sa destination est remplacée par une copie qui peut être lue et par-dessus laquelle on peut écrire.
L’exemple de code suivant montre comment copier une version de l’objet blob sur l’objet blob de base :
public static async Task<BlockBlobClient> CopyVersionOverBaseBlobAsync(
BlockBlobClient client,
string versionTimestamp)
{
// Instantiate BlobClient with identical URI and add version timestamp
BlockBlobClient versionClient = client.WithVersion(versionTimestamp);
// Restore the specified version by copying it over the base blob
await client.SyncUploadFromUriAsync(versionClient.Uri);
// Return the client object after the copy operation
return client;
}
Ressources
Pour en savoir plus sur la gestion des versions de l’objet blob à l’aide de la bibliothèque de client du Stockage Blob Azure pour .NET, consultez les ressources suivantes.
Ressources de bibliothèque cliente
- Documentation de référence sur la bibliothèque cliente
- Code source de la bibliothèque de client
- Package (NuGet)