Delen via


Een blob kopiëren met asynchrone planning met behulp van .NET

In dit artikel wordt beschreven hoe u een blob kopieert met asynchrone planning met behulp van de Azure Storage-clientbibliotheek voor .NET. U kunt een blob kopiëren vanuit een bron binnen hetzelfde opslagaccount, van een bron in een ander opslagaccount of van een toegankelijk object dat via een HTTP GET-aanvraag op een bepaalde URL wordt opgehaald. U kunt ook een in behandeling zijnde kopieerbewerking afbreken.

De clientbibliotheekmethoden die in dit artikel worden behandeld, maken gebruik van de bewerking Blob REST API kopiëren en kunnen worden gebruikt wanneer u een kopie wilt uitvoeren met asynchrone planning. Voor de meeste kopieerscenario's waarin u gegevens naar een opslagaccount wilt verplaatsen en een URL voor het bronobject wilt hebben, raadpleegt u Een blob kopiëren van een bronobject-URL met .NET.

Vereisten

Uw omgeving instellen

Als u geen bestaand project hebt, ziet u in deze sectie hoe u een project instelt voor gebruik met de Azure Blob Storage-clientbibliotheek voor .NET. De stappen omvatten pakketinstallatie, het toevoegen van using instructies en het maken van een geautoriseerd clientobject. Zie Aan de slag met Azure Blob Storage en .NET voor meer informatie.

Pakketten installeren

Installeer vanuit uw projectmap pakketten voor de Azure Blob Storage- en Azure Identity-clientbibliotheken met behulp van de dotnet add package opdracht. Het Azure.Identity-pakket is nodig voor verbindingen zonder wachtwoord met Azure-services.

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

Voeg using-instructies toe

Voeg deze using instructies toe aan het begin van het codebestand:

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

Voor sommige codevoorbeelden in dit artikel zijn mogelijk aanvullende using instructies vereist.

Een clientobject maken

Als u een app wilt verbinden met Blob Storage, maakt u een exemplaar van BlobServiceClient. In het volgende voorbeeld ziet u hoe u een clientobject maakt met behulp van DefaultAzureCredential autorisatie:

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

    return client;
}

U kunt een serviceclient registreren voor afhankelijkheidsinjectie in een .NET-app.

U kunt ook clientobjecten maken voor specifieke containers of blobs. Zie Clientobjecten maken en beheren die interactie hebben met gegevensbronnen voor meer informatie over het maken en beheren van clientobjecten.

Autorisatie

Het autorisatiemechanisme moet over de benodigde machtigingen beschikken om een kopieerbewerking uit te voeren of om een in behandeling zijnde kopie af te breken. Voor autorisatie met Microsoft Entra ID (aanbevolen), varieert de ingebouwde rol van Azure RBAC met minimale bevoegdheden op basis van verschillende factoren. Zie de autorisatierichtlijnen voor Copy Blob (REST API) of Abort Copy Blob (REST API) voor meer informatie.

Over het kopiëren van blobs met asynchrone planning

De Copy Blob bewerking kan asynchroon worden voltooid en wordt uitgevoerd op basis van best effort, wat betekent dat de bewerking niet gegarandeerd onmiddellijk of binnen een opgegeven tijdsbestek wordt gestart of voltooid. De kopieerbewerking wordt op de achtergrond gepland en uitgevoerd als de server beschikbare resources heeft. De bewerking kan synchroon worden voltooid als de kopie plaatsvindt binnen hetzelfde opslagaccount.

Een Copy Blob bewerking kan een van de volgende acties uitvoeren:

  • Kopieer een bron-blob naar een doel-blob met een andere naam. De doel-blob kan een bestaande blob zijn van hetzelfde blobtype (blok, toevoeg of pagina), of kan een nieuwe blob zijn die is gemaakt door de kopieerbewerking.
  • Kopieer een bron-blob naar een doel-blob met dezelfde naam, waardoor de doel-blob wordt vervangen. Met dit type kopieerbewerking worden eventuele niet-doorgevoerde blokken verwijderd en worden de metagegevens van de doel-blob overschreven.
  • Kopieer een bronbestand in de Azure File-service naar een doel-blob. De doel-blob kan een bestaande blok-blob zijn of kan een nieuwe blok-blob zijn die is gemaakt door de kopieerbewerking. Kopiëren van bestanden naar pagina-blobs of toevoeg-blobs wordt niet ondersteund.
  • Kopieer een momentopname over de basis-blob. Door een momentopname te promoveren naar de positie van de basis-blob, kunt u een eerdere versie van een blob herstellen.
  • Kopieer een momentopname naar een doel-blob met een andere naam. De resulterende doel-blob is een beschrijfbare blob en geen momentopname.

Zie Blob-opmerkingen kopiëren voor meer informatie over de Copy Blob bewerking, waaronder informatie over eigenschappen, indextags, metagegevens en facturering.

Een blob kopiëren met asynchrone planning

In deze sectie vindt u een overzicht van methoden die door de Azure Storage-clientbibliotheek voor .NET worden geboden om een kopieerbewerking uit te voeren met asynchrone planning.

Met de volgende methoden wordt de rest API-bewerking voor kopiëren blob verpakt en wordt een asynchrone kopie van gegevens uit de bron-blob gestart:

De StartCopyFromUri en StartCopyFromUriAsync methoden retourneren een CopyFromUriOperation-object met informatie over de kopieerbewerking. Deze methoden worden gebruikt wanneer u asynchrone planning voor een kopieerbewerking wilt.

Een blob kopiëren vanuit een bron in Azure

Als u een blob in hetzelfde opslagaccount kopieert, kan de bewerking synchroon worden voltooid. Toegang tot de bron-blob kan worden geautoriseerd via Microsoft Entra ID, een Shared Access Signature (SAS) of een accountsleutel. Zie Een blob kopiëren van een bronobject-URL met .NET voor een afwisselende synchrone kopieerbewerking.

Als de kopieerbron een blob in een ander opslagaccount is, kan de bewerking asynchroon worden voltooid. De bron-blob moet openbaar of geautoriseerd zijn via een SAS-token. Het SAS-token moet de machtiging Lezen ('r') bevatten. Zie Toegang delegeren met handtekeningen voor gedeelde toegang voor meer informatie over SAS-tokens.

In het volgende voorbeeld ziet u een scenario voor het kopiëren van een bronblob uit een ander opslagaccount met asynchrone planning. In dit voorbeeld maken we een bron-blob-URL met een toegevoegd SAS-token voor gebruikersdelegering. In het voorbeeld ziet u hoe u het SAS-token genereert met behulp van de clientbibliotheek, maar u kunt ook uw eigen token opgeven. In het voorbeeld ziet u ook hoe u de bron-blob tijdens de kopieerbewerking kunt leasen om wijzigingen in de blob van een andere client te voorkomen. Met Copy Blob de bewerking wordt de ETag waarde van de bron-blob opgeslagen wanneer de kopieerbewerking wordt gestart. Als de ETag waarde wordt gewijzigd voordat de kopieerbewerking is voltooid, mislukt de bewerking.

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

Notitie

SAS-tokens voor gebruikersdelegatie bieden meer beveiliging, omdat ze zijn ondertekend met Microsoft Entra-referenties in plaats van een accountsleutel. Voor het maken van een SAS-token voor gebruikersdelegering heeft de Microsoft Entra-beveiligingsprincipaal de juiste machtigingen nodig. Zie Sleutel voor gebruikersdelegering ophalen voor autorisatievereisten.

Een blob kopiëren van een bron buiten Azure

U kunt een kopieerbewerking uitvoeren op elk bronobject dat kan worden opgehaald via een HTTP GET-aanvraag op een bepaalde URL, inclusief toegankelijke objecten buiten Azure. In het volgende voorbeeld ziet u een scenario voor het kopiëren van een blob vanuit een toegankelijke bronobject-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();
}

De status van een kopieerbewerking controleren

Als u de status van een Copy Blob bewerking wilt controleren, kunt u UpdateStatusAsync aanroepen en het antwoord parseren om de waarde voor de x-ms-copy-status header op te halen.

In het volgende codevoorbeeld ziet u hoe u de status van een kopieerbewerking kunt controleren:

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

Een kopieerbewerking afbreken

Het afbreken van een in behandeling zijnde Copy Blob bewerking resulteert in een doel-blob met een lengte van nul. De metagegevens voor de doel-blob bevatten echter de nieuwe waarden die uit de bron-blob zijn gekopieerd of expliciet zijn ingesteld tijdens de kopieerbewerking. Als u de oorspronkelijke metagegevens van vóór de kopie wilt bewaren, maakt u een momentopname van de doel-blob voordat u een van de kopieermethoden aanroept.

Als u een kopieerbewerking in behandeling wilt afbreken, roept u een van de volgende bewerkingen aan:

Met deze methoden wordt de bewerking Copy Blob REST API afgebroken, waardoor een bewerking in behandeling Copy Blob wordt geannuleerd. In het volgende codevoorbeeld ziet u hoe u een bewerking in behandeling Copy Blob kunt afbreken:

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

Resources

Zie de volgende resources voor meer informatie over het kopiëren van blobs met behulp van de Azure Blob Storage-clientbibliotheek voor .NET.

Codevoorbeelden

REST API-bewerkingen

De Azure SDK voor .NET bevat bibliotheken die zijn gebaseerd op de Azure REST API, zodat u kunt communiceren met REST API-bewerkingen via bekende .NET-paradigma's. De clientbibliotheekmethoden die in dit artikel worden behandeld, gebruiken de volgende REST API-bewerkingen:

  • Blob kopiëren (REST API)
  • Blob kopiëren afbreken (REST API)

Clientbibliotheekbronnen

  • Dit artikel maakt deel uit van de ontwikkelaarshandleiding voor Blob Storage voor .NET. Zie de volledige lijst met artikelen over ontwikkelaarshandleidingen in Uw .NET-app bouwen voor meer informatie.