Поделиться через


Копирование большого двоичного объекта с асинхронным планированием с помощью .NET

В этой статье показано, как скопировать большой двоичный объект с асинхронным планированием с помощью клиентской библиотеки служба хранилища Azure для .NET. Большой двоичный объект можно скопировать из источника в той же учетной записи хранения, из источника в другой учетной записи хранения или из любого доступного объекта, полученного через HTTP-запрос GET по указанному URL-адресу. Кроме того, можно прервать ожидающие операции копирования.

Методы клиентской библиотеки, описанные в этой статье, используют операцию REST API копирования BLOB-объектов и могут использоваться при выполнении копирования с асинхронным планированием. В большинстве сценариев копирования, в которых требуется переместить данные в учетную запись хранения и указать URL-адрес исходного объекта, см. статью "Копирование большого двоичного объекта" из URL-адреса исходного объекта с помощью .NET.

Необходимые компоненты

Настройка среды

Если у вас нет существующего проекта, в этом разделе показано, как настроить проект для работы с клиентской библиотекой Хранилище BLOB-объектов Azure для .NET. Ниже приведены шаги по установке пакета, добавлению using директив и созданию авторизованного клиентского объекта. Дополнительные сведения см. в статье "Начало работы с Хранилище BLOB-объектов Azure и .NET".

Установка пакетов

В каталоге проекта установите пакеты для клиентских библиотек Хранилище BLOB-объектов Azure и удостоверений Azure с помощью dotnet add package команды. Пакет Azure.Identity необходим для бессерверных подключений к службам Azure.

dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity

Добавьте директивы using.

Добавьте эти using директивы в начало файла кода:

using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;

Для некоторых примеров кода в этой статье могут потребоваться дополнительные using директивы.

Создание клиентского объекта

Чтобы подключить приложение к хранилищу BLOB-объектов, создайте экземпляр BLOBServiceClient. В следующем примере показано, как создать клиентский объект с помощью DefaultAzureCredential авторизации:

public BlobServiceClient GetBlobServiceClient(string accountName)
{
    BlobServiceClient client = new(
        new Uri($"https://{accountName}.blob.core.windows.net"),
        new DefaultAzureCredential());

    return client;
}

Вы можете зарегистрировать клиент службы для внедрения зависимостей в приложении .NET.

Вы также можете создавать клиентские объекты для определенных контейнеров или больших двоичных объектов. Дополнительные сведения о создании клиентских объектов и управлении ими см. в статье "Создание клиентских объектов и управление ими", взаимодействующих с ресурсами данных.

Авторизация

Механизм авторизации должен иметь необходимые разрешения для выполнения операции копирования или прерывания ожидающей копии. Для авторизации с помощью идентификатора Microsoft Entra (рекомендуется), встроенная роль RBAC Azure RBAC наименее привилегированная зависит от нескольких факторов. Дополнительные сведения см. в руководстве по авторизации для копирования BLOB-объектов (REST API) или прерывания копирования BLOB-объектов (REST API).

О копировании больших двоичных объектов с помощью асинхронного планирования

Операция Copy Blob может завершиться асинхронно и выполняется на основе наилучших усилий, что означает, что операция не гарантируется немедленно или завершена в течение указанного интервала времени. Операция копирования запланирована в фоновом режиме и выполняется, так как сервер имеет доступные ресурсы. Операция может выполняться синхронно, если копия происходит в той же учетной записи хранения.

Операция Copy Blob может выполнять любое из следующих действий:

  • Копирование исходного большого двоичного объекта в целевой большой двоичный объект с другим именем. Целевой большой двоичный объект может быть существующим BLOB-объектом одного типа (блокировать, добавить или страницу) или быть новым BLOB-объектом, созданным операцией копирования.
  • Скопируйте исходный большой двоичный объект в целевой большой двоичный объект с тем же именем, который заменяет целевой большой двоичный объект. Этот тип операции копирования удаляет все незафиксированные блоки и перезаписывает метаданные целевого BLOB-объекта.
  • Копирование исходного файла из службы файлов Azure в целевой большой двоичный объект. Целевым большим двоичным объектом может быть существующий блочный BLOB-объект или новый блочный BLOB-объект, созданный операцией копирования. Копирование из файлов в страничные большие двоичные объекты или добавление больших двоичных объектов не поддерживается.
  • Копирование моментального снимка поверх его базового большого двоичного объекта. Повысив уровень моментального снимка до базового большого двоичного объекта, можно восстановить более раннюю версию большого двоичного объекта.
  • Копирование моментального снимка в целевой большой двоичный объект с другим именем. Результирующий целевой большой двоичный объект не станет моментальным снимком, а будет большим двоичным объектом, доступным для записи.

Дополнительные сведения об операции, включая сведения о свойствах, тегах индекса, метаданных и выставлении счетов, см. в примечаниях Copy Blobкопирования BLOB-объектов.

Копирование большого двоичного объекта с асинхронным планированием

В этом разделе представлен обзор методов, предоставляемых клиентской библиотекой служба хранилища Azure для .NET для выполнения операции копирования с асинхронным планированием.

Следующие методы упаковывают операцию REST API копирования BLOB-объектов и начинают асинхронную копию данных из исходного BLOB-объекта:

Методы StartCopyFromUri и StartCopyFromUriAsync возвращают объект CopyFromUriOperation, содержащий сведения об операции копирования. Эти методы используются при необходимости асинхронного планирования операции копирования.

Копирование большого двоичного объекта из источника в Azure

Если вы копируете большой двоичный объект в той же учетной записи хранения, операция может выполняться синхронно. Доступ к исходному BLOB-объекту можно авторизовать с помощью идентификатора Microsoft Entra, подписанного URL-адресом (SAS) или ключа учетной записи. Сведения об изменении синхронной операции копирования см. в разделе "Копирование большого двоичного объекта" из URL-адреса исходного объекта с помощью .NET.

Если источник копирования является большим двоичным объектом в другой учетной записи хранения, операция может выполняться асинхронно. Исходный большой двоичный объект должен быть общедоступным или авторизованным с помощью маркера SAS. Маркер SAS должен включать разрешение read ('r'). Дополнительные сведения о маркерах SAS см. в статье "Делегирование доступа с подписанными URL-адресами".

В следующем примере показан сценарий копирования исходного большого двоичного объекта из другой учетной записи хранения с асинхронным планированием. В этом примере мы создадим URL-адрес исходного BLOB-объекта с добавленным маркером SAS делегирования пользователей. В примере показано, как создать маркер SAS с помощью клиентской библиотеки, но вы также можете предоставить собственные. В примере также показано, как арендовать исходный большой двоичный объект во время операции копирования, чтобы предотвратить изменения большого двоичного объекта от другого клиента. Операция Copy Blob сохраняет ETag значение исходного БОЛЬШОго двоичного объекта при запуске операции копирования. ETag Если значение изменяется до завершения операции копирования, операция завершается ошибкой.

//-------------------------------------------------
// Copy a blob from a different storage account
//-------------------------------------------------
public static async Task CopyAcrossStorageAccountsAsync(
    BlobClient sourceBlob,
    BlockBlobClient destinationBlob)
{
    // Lease the source blob to prevent changes during the copy operation
    BlobLeaseClient sourceBlobLease = new(sourceBlob);

    // Create a Uri object with a SAS token appended - specify Read (r) permissions
    Uri sourceBlobSASURI = await GenerateUserDelegationSAS(sourceBlob);

    try
    {
        await sourceBlobLease.AcquireAsync(BlobLeaseClient.InfiniteLeaseDuration);

        // Start the copy operation and wait for it to complete
        CopyFromUriOperation copyOperation = await destinationBlob.StartCopyFromUriAsync(sourceBlobSASURI);
        await copyOperation.WaitForCompletionAsync();
    }
    catch (RequestFailedException ex)
    {
        // Handle the exception
    }
    finally
    {
        // Release the lease once the copy operation completes
        await sourceBlobLease.ReleaseAsync();
    }
}

async static Task<Uri> GenerateUserDelegationSAS(BlobClient sourceBlob)
{
    BlobServiceClient blobServiceClient =
        sourceBlob.GetParentBlobContainerClient().GetParentBlobServiceClient();

    // Get a user delegation key for the Blob service that's valid for 1 day
    UserDelegationKey userDelegationKey =
        await blobServiceClient.GetUserDelegationKeyAsync(DateTimeOffset.UtcNow,
                                                          DateTimeOffset.UtcNow.AddDays(1));

    // Create a SAS token that's also valid for 1 day
    BlobSasBuilder sasBuilder = new BlobSasBuilder()
    {
        BlobContainerName = sourceBlob.BlobContainerName,
        BlobName = sourceBlob.Name,
        Resource = "b",
        StartsOn = DateTimeOffset.UtcNow,
        ExpiresOn = DateTimeOffset.UtcNow.AddDays(1)
    };

    // Specify read permissions for the SAS
    sasBuilder.SetPermissions(BlobSasPermissions.Read);

    // Add the SAS token to the blob URI
    BlobUriBuilder blobUriBuilder = new BlobUriBuilder(sourceBlob.Uri)
    {
        // Specify the user delegation key
        Sas = sasBuilder.ToSasQueryParameters(userDelegationKey,
                                              blobServiceClient.AccountName)
    };

    return blobUriBuilder.ToUri();
}

Примечание.

Маркеры SAS делегирования пользователей обеспечивают большую безопасность, так как они подписаны с учетными данными Microsoft Entra вместо ключа учетной записи. Чтобы создать маркер SAS делегирования пользователей, субъект безопасности Microsoft Entra должен иметь соответствующие разрешения. Сведения о требованиях к авторизации см. в разделе "Получение ключа делегирования пользователей".

Копирование большого двоичного объекта из источника за пределами Azure

Вы можете выполнить операцию копирования для любого исходного объекта, который можно получить через HTTP-запрос GET по указанному URL-адресу, включая доступные объекты за пределами Azure. В следующем примере показано, как скопировать большой двоичный объект из URL-адреса объекта с доступом.

//-------------------------------------------------
// Copy a blob from an external source
//-------------------------------------------------
public static async Task CopyFromExternalSourceAsync(
    string sourceLocation,
    BlockBlobClient destinationBlob)
{
    Uri sourceUri = new(sourceLocation);

    // Start the copy operation and wait for it to complete
    CopyFromUriOperation copyOperation = await destinationBlob.StartCopyFromUriAsync(sourceUri);
    await copyOperation.WaitForCompletionAsync();
}

Проверка состояния операции копирования

Чтобы проверить состояние Copy Blob операции, можно вызвать UpdateStatusAsync и проанализировать ответ, чтобы получить значение заголовка x-ms-copy-status .

В следующем примере кода показано, как проверить состояние операции копирования:

public static async Task CheckCopyStatusAsync(CopyFromUriOperation copyOperation)
{
    // Check for the latest status of the copy operation
    Response response = await copyOperation.UpdateStatusAsync();

    // Parse the response to find x-ms-copy-status header
    if (response.Headers.TryGetValue("x-ms-copy-status", out string value))
        Console.WriteLine($"Copy status: {value}");
}

Прерывание операции копирования

Прерывание ожидающей Copy Blob операции приводит к тому, что целевой большой двоичный объект нулевой длины. Однако метаданные для целевого большого двоичного объекта имеют новые значения, скопированные из исходного большого двоичного объекта или явно заданные во время операции копирования. Чтобы сохранить исходные метаданные, существовавшие до копирования, создайте моментальный снимок целевого большого двоичного объекта перед вызовом методов копирования.

Чтобы прервать ожидающие операции копирования, вызовите одну из следующих операций:

Эти методы обтекают операцию ABort Copy BLOB REST API, которая отменяет ожидающую Copy Blob операцию. В следующем примере кода показано, как прервать ожидающие Copy Blob операции:

public static async Task AbortBlobCopyAsync(
    CopyFromUriOperation copyOperation,
    BlobClient destinationBlob)
{
    // Check for the latest status of the copy operation
    Response response = await copyOperation.UpdateStatusAsync();

    // Parse the response to find x-ms-copy-status header
    if (response.Headers.TryGetValue("x-ms-copy-status", out string value))
    {
        if (value == "pending")
        {
            await destinationBlob.AbortCopyFromUriAsync(copyOperation.Id);
            Console.WriteLine($"Copy operation {copyOperation.Id} aborted");
        }
    }
}

Ресурсы

Дополнительные сведения о копировании больших двоичных объектов с помощью клиентской библиотеки Хранилище BLOB-объектов Azure для .NET см. в следующих ресурсах.

Операции REST API

Пакет SDK Azure для .NET содержит библиотеки, которые создаются на основе REST API Azure, что позволяет взаимодействовать с операциями REST API через знакомые парадигмы .NET. Методы клиентской библиотеки, описанные в этой статье, используют следующие операции REST API:

Примеры кода

Ресурсы клиентской библиотеки