Teilen über


Kopieren eines Blobs mit asynchroner Planung mithilfe von .NET

In diesem Artikel wird gezeigt, wie Sie ein Blob mit asynchroner Planung mithilfe der Azure Storage-Clientbibliothek für .NET kopieren. Sie können ein Blob aus einer Quelle innerhalb desselben Speicherkontos, aus einer Quelle in einem anderen Speicherkonto oder aus einem beliebigen zugänglichen Objekt kopieren, das über eine HTTP GET-Anforderung für eine bestimmte URL abgerufen wird. Sie können einen ausstehenden Kopiervorgang auch abbrechen.

Die in diesem Artikel behandelten Clientbibliotheksmethoden verwenden den REST-API-Vorgang Copy Blob und können verwendet werden, wenn Sie einen Kopiervorgang mit asynchroner Planung durchführen möchten. Informationen zu den meisten Kopierszenarien, in denen Sie Daten in ein Speicherkonto verschieben möchten und über eine URL für das Quellobjekt verfügen, finden Sie unter Kopieren eines Blobs über eine Quellobjekt-URL mit .NET.

Voraussetzungen

Erstellen Ihrer Umgebung

Wenn Sie nicht über ein vorhandenes Projekt verfügen, wird in diesem Abschnitt gezeigt, wie Sie ein Projekt für die Arbeit mit der Azure Blob Storage-Clientbibliothek für .NET einrichten. Die Schritte umfassen die Paketinstallation, das Hinzufügen von using-Anweisungen und das Erstellen eines autorisierten Clientobjekts. Ausführlichere Informationen finden Sie unter Erste Schritte mit Azure Blob Storage und .NET.

Installieren von Paketen

Installieren Sie in Ihrem Projektverzeichnis mithilfe des Befehls dotnet add package Pakete für die Azure Blob Storage- und Azure Identity-Clientbibliotheken. Für kennwortlose Verbindungen mit Azure-Diensten wird das Azure.Identity-Paket benötigt.

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

Fügen Sie Anweisungen vom Typ using hinzu.

Fügen Sie diese using-Anweisungen am Anfang der Codedatei hinzu:

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

Einige Codebeispiele in diesem Artikel erfordern möglicherweise zusätzliche using-Anweisungen.

Erstellen eines Clientobjekts

Um eine App mit Blob Storage zu verbinden, erstellen Sie eine Instanz von BlobServiceClient. Das folgende Beispiel zeigt, wie Sie ein Clientobjekt mithilfe von DefaultAzureCredential für die Autorisierung erstellen:

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

    return client;
}

Sie können auch einen Dienstclient für die Abhängigkeitsinjektion in einer .NET-App registrieren. Weitere Informationen zum Erstellen und Verwalten von Clientobjekten finden Sie unter Erstellen und Verwalten von Clientobjekten, die mit Datenressourcen interagieren.

Autorisierung

Der Autorisierungsmechanismus muss über die benötigten Berechtigungen zum Ausführen eines Kopiervorgangs oder zum Abbrechen einer ausstehenden Kopie verfügen. Für die Autorisierung mit Microsoft Entra ID (empfohlen) variiert die integrierte Azure RBAC-Rolle mit den geringsten Berechtigungen je nach verschiedenen Faktoren. Weitere Informationen finden Sie im Autorisierungsleitfaden für Copy Blob (REST API) oder Abort Copy Blob (REST API).

Informationen zum Kopieren von Blobs mit asynchroner Planung

Der Copy Blob-Vorgang kann asynchron abgeschlossen werden und wird auf Grundlage der besten Leistung ausgeführt, d. h., es wird nicht garantiert, dass der Vorgang sofort beginnt oder innerhalb eines bestimmten Zeitrahmens abgeschlossen wird. Der Kopiervorgang wird im Hintergrund geplant und ausgeführt, sobald der Server über verfügbare Ressourcen verfügt. Der Vorgang kann synchron abgeschlossen werden, wenn der Kopiervorgang innerhalb desselben Speicherkontos erfolgt.

Ein Vorgang vom Typ Copy Blob kann jede der folgenden Aktionen ausführen:

  • Kopieren Sie ein Quellblob in ein Zielblob mit einem anderen Namen. Das Zielblob kann ein vorhandenes Blob desselben Blobtyps (Blockblob, Anfügeblob oder Seitenblob) sein, oder es kann sich um ein neues Blob handeln, das durch den Kopiervorgang erstellt wurde.
  • Kopieren Sie ein Quellblob in ein Zielblob mit demselben Namen. Dadurch wird das Zielblob ersetzt. Diese Art von Kopiervorgang entfernt alle Blöcke ohne Commit und überschreibt die Metadaten des Zielblobs.
  • Kopieren Sie eine Quelldatei im Azure-Dateidienst in ein Zielblob. Das Zielblob kann ein vorhandenes Blockblob oder ein neues Blockblob sein, das durch den Kopiervorgang erstellt wurde. Das Kopieren von Dateien in Seitenblobs oder Anfügeblobs wird nicht unterstützt.
  • Kopieren Sie eine Momentaufnahme über das zugehörige Basis-Blob. Indem Sie eine Momentaufnahme zu einem Basis-Blob heraufstufen, können Sie eine frühere Version eines Blobs wiederherstellen.
  • Kopieren Sie eine Momentaufnahme in ein Zielblob mit einem anderen Namen. Das resultierende Zielblob ist ein beschreibbares Blob und keine Momentaufnahme.

Weitere Informationen zum Copy Blob-Vorgang, einschließlich Informationen zu Eigenschaften, Indextags, Metadaten und Abrechnung, finden Sie unter Bemerkungen.

Kopieren eines Blobs mit asynchroner Planung

Dieser Abschnitt enthält eine Übersicht über die Methoden, die von der Azure Storage-Clientbibliothek für .NET bereitgestellt werden, um einen Kopiervorgang mit asynchroner Planung auszuführen.

Die folgenden Methoden umschließen den REST-API-Vorgang Copy Blob und starten einen asynchronen Kopiervorgang von Daten aus dem Quellblob:

Die Methoden StartCopyFromUri und StartCopyFromUriAsync geben ein CopyFromUriOperation-Objekt zurück, das Informationen über den Kopiervorgang enthält. Diese Methoden werden verwendet, wenn Sie für einen Kopiervorgang die asynchrone Planung verwenden möchten.

Kopieren eines Blobs aus einer Quelle in Azure

Wenn Sie ein Blob innerhalb desselben Speicherkontos kopieren, kann der Vorgang synchron abgeschlossen werden. Der Zugriff auf den Quellblob kann über Microsoft Entra ID, Shared Access Signature (SAS) oder einen Kontoschlüssel autorisiert werden. Einen alternativen synchronen Kopiervorgang finden Sie unter Kopieren eines Blob aus einer Quellobjekt-URL mit .NET.

Wenn die Kopierquelle ein Blob in einem anderen Speicherkonto ist, kann der Vorgang asynchron abgeschlossen werden. Der Quellblob muss entweder öffentlich oder über ein SAS-Token autorisiert sein. Das SAS-Token muss die Berechtigung zum Lesen (Read ('r')) enthalten. Weitere Informationen zu SAS-Token finden Sie unter Gewähren von eingeschränktem Zugriff auf Azure Storage-Ressourcen mithilfe von SAS (Shared Access Signature).

Das folgende Beispiel zeigt ein Szenario für das Kopieren eines Quellblob aus einem anderen Speicherkonto mit asynchroner Planung. In diesem Beispiel wird eine Quellblob-URL mit einem angehängten SAS-Token für die Benutzerdelegierung erstellt. Das Beispiel zeigt, wie das SAS-Token mit Hilfe der Client-Bibliothek erzeugt wird. Sie können aber auch Ihr eigenes Token bereitstellen. Das Beispiel zeigt auch, wie der Quellblob während des Kopiervorgangs geleast werden kann, um Änderungen am Blob durch einen anderen Client zu verhindern. Der Copy Blob-Vorgang speichert den ETag-Wert des Quellblobs, wenn der Kopiervorgang gestartet wird. Wenn der ETag-Wert geändert wird, bevor der Kopiervorgang abgeschlossen ist, ist der Vorgang nicht erfolgreich.

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

Hinweis

SAS-Token für die Benutzerdelegierung bieten mehr Sicherheit, da sie mit Microsoft Entra-Anmeldeinformationen anstelle eines Kontoschlüssels signiert sind. Um ein SAS-Token für die Benutzerdelegierung zu erstellen, benötigt der Microsoft Entra-Sicherheitsprinzipal entsprechende Berechtigungen. Informationen zu den Berechtigungsanforderungen finden Sie unter Benutzerdelegierungsschlüssel abrufen.

Kopieren eines Blobs aus einer Quelle außerhalb von Azure

Sie können einen Kopiervorgang für jedes Quellobjekt ausführen, das über eine HTTP GET-Anforderung für eine bestimmte URL abgerufen werden kann, einschließlich zugänglicher Objekte außerhalb von Azure. Das folgende Beispiel zeigt ein Szenario zum Kopieren eines Blobs über eine URL für zugängliche Quellobjekte.

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

Überprüfen des Status eines Kopiervorgangs

Um den Status eines Copy Blob-Vorgangs zu überprüfen, können Sie UpdateStatusAsync aufrufen und die Antwort parsen, um den Wert für den x-ms-copy-status-Header abzurufen.

Das folgende Codebeispiel zeigt, wie der Status eines Kopiervorgangs überprüft werden kann:

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

Abbrechen eines Kopiervorgangs

Ein Abbrechen eines ausstehenden Copy Blob-Vorgangs führt zu einem Zielblob der Länge null. Die Metadaten für das Zielblob weisen jedoch die neuen Werte auf, die aus dem Quellblob kopiert oder explizit während des Kopiervorgangs festgelegt wurden. Zur Beibehaltung der ursprünglichen, vor dem Kopiervorgang vorliegenden Metadaten erstellen Sie eine Momentaufnahme des Zielblobs, bevor Sie eine der Kopiermethoden aufrufen.

Um einen ausstehenden Kopiervorgang abzubrechen, rufen Sie einen der folgenden Vorgänge auf:

Diese Methoden umschließen den REST-API-Vorgang Abort Copy Blob, wodurch ein ausstehender Copy Blob-Vorgang abgebrochen wird. Das folgenden Codebeispiel zeigt, wie ein ausstehender Copy Blob-Vorgang abgebrochen wird:

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

Ressourcen

Weitere Informationen zum Kopieren von Blobs mithilfe der Azure Blob Storage-Clientbibliothek für .NET finden Sie in den folgenden Ressourcen.

REST-API-Vorgänge

Das Azure SDK für .NET enthält Bibliotheken, die auf der zugrunde liegenden Azure-REST-API basieren, und ermöglicht Ihnen dadurch die Interaktion mit REST-API-Vorgängen über vertraute .NET-Paradigmen. Die Clientbibliotheksmethoden, die in diesem Artikel behandelt werden, verwenden die folgenden REST-API-Vorgänge:

Codebeispiele

Ressourcen zur Clientbibliothek