Udostępnij za pośrednictwem


Tworzenie i wyświetlanie listy wersji obiektów blob na platformie .NET

Przechowywanie wersji obiektów blob automatycznie tworzy poprzednią wersję obiektu blob za każdym razem, gdy zostanie on zmodyfikowany lub usunięty. Po włączeniu przechowywania wersji obiektów blob można przywrócić wcześniejszą wersję obiektu blob, aby odzyskać dane, jeśli zostaną one błędnie zmodyfikowane lub usunięte.

Aby uzyskać optymalną ochronę danych, firma Microsoft zaleca włączenie przechowywania wersji obiektów blob i usuwania nietrwałego obiektów blob dla konta magazynu. Aby uzyskać więcej informacji, zobacz Przechowywanie wersji obiektów blob i Usuwanie nietrwałe dla obiektów blob.

Modyfikowanie obiektu blob w celu wyzwolenia nowej wersji

Poniższy przykład kodu pokazuje, jak wyzwolić tworzenie nowej wersji za pomocą biblioteki klienta usługi Azure Storage dla platformy .NET w wersji 12.5.1 lub nowszej. Przed uruchomieniem tego przykładu upewnij się, że włączono przechowywanie wersji dla konta magazynu.

W przykładzie tworzony jest blokowy obiekt blob, a następnie aktualizuje metadane obiektu blob. Aktualizowanie metadanych obiektu blob wyzwala tworzenie nowej wersji. Przykład pobiera wersję początkową i bieżącą wersję oraz pokazuje, że tylko bieżąca wersja zawiera metadane.

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);
    }
}

Wyświetlanie listy wersji obiektów blob

Aby wyświetlić listę wersji obiektów blob, określ parametr BlobStates z polem Wersja . Wersje są wymienione od najstarszych do najnowszych.

Poniższy przykład kodu przedstawia sposób wyświetlania listy wersji obiektów 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;
    }
}

Kopiowanie poprzedniej wersji obiektu blob do podstawowego obiektu blob

Możesz wykonać operację kopiowania w celu podwyższenia poziomu wersji do podstawowego obiektu blob, o ile podstawowy obiekt blob znajduje się w warstwie online (gorąca lub chłodna). Wersja pozostaje, ale jej miejsce docelowe jest zastępowane kopią, do których można odczytywać i zapisywać.

Poniższy przykład kodu pokazuje, jak skopiować wersję obiektu blob do podstawowego obiektu blob:

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;
}

Zasoby

Aby dowiedzieć się więcej na temat zarządzania wersjami obiektów blob przy użyciu biblioteki klienta Azure Blob Storage dla platformy .NET, zobacz następujące zasoby.

Zasoby biblioteki klienta

Zobacz też