Dela via


Kopiera en blob med asynkron schemaläggning med hjälp av .NET

Den här artikeln visar hur du kopierar en blob med asynkron schemaläggning med hjälp av Azure Storage-klientbiblioteket för .NET. Du kan kopiera en blob från en källa inom samma lagringskonto, från en källa i ett annat lagringskonto eller från alla tillgängliga objekt som hämtas via HTTP GET-begäran på en viss URL. Du kan också avbryta en väntande kopieringsåtgärd.

De klientbiblioteksmetoder som beskrivs i den här artikeln använder åtgärden Kopiera BLOB REST API och kan användas när du vill utföra en kopia med asynkron schemaläggning. De flesta kopieringsscenarier där du vill flytta data till ett lagringskonto och ha en URL för källobjektet finns i Kopiera en blob från en källobjekt-URL med .NET.

Förutsättningar

Konfigurera din miljö

Om du inte har ett befintligt projekt visar det här avsnittet hur du konfigurerar ett projekt för att arbeta med Azure Blob Storage-klientbiblioteket för .NET. Stegen omfattar paketinstallation, tillägg av using direktiv och skapande av ett auktoriserat klientobjekt. Mer information finns i Kom igång med Azure Blob Storage och .NET.

Installera paket

Från projektkatalogen installerar du paket för Azure Blob Storage- och Azure Identity-klientbiblioteken med hjälp av dotnet add package kommandot . Azure.Identity-paketet behövs för lösenordslösa anslutningar till Azure-tjänster.

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

Lägga till using direktiv

Lägg till dessa using direktiv överst i kodfilen:

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

Vissa kodexempel i den här artikeln kan kräva ytterligare using direktiv.

Skapa ett klientobjekt

Om du vill ansluta en app till Blob Storage skapar du en instans av BlobServiceClient. I följande exempel visas hur du skapar ett klientobjekt med hjälp av DefaultAzureCredential för auktorisering:

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

    return client;
}

Du kan registrera en tjänstklient för beroendeinmatning i en .NET-app.

Du kan också skapa klientobjekt för specifika containrar eller blobar. Mer information om hur du skapar och hanterar klientobjekt finns i Skapa och hantera klientobjekt som interagerar med dataresurser.

Auktorisering

Auktoriseringsmekanismen måste ha de behörigheter som krävs för att utföra en kopieringsåtgärd eller avbryta en väntande kopia. För auktorisering med Microsoft Entra-ID (rekommenderas) varierar den minst privilegierade inbyggda Azure RBAC-rollen baserat på flera faktorer. Mer information finns i auktoriseringsvägledningen för Copy Blob (REST API) eller Abort Copy Blob (REST API).

Om att kopiera blobar med asynkron schemaläggning

Åtgärden Copy Blob kan slutföras asynkront och utförs på bästa sätt, vilket innebär att åtgärden inte garanteras starta omedelbart eller slutföras inom en angiven tidsram. Kopieringsåtgärden schemaläggs i bakgrunden och utförs eftersom servern har tillgängliga resurser. Åtgärden kan slutföras synkront om kopian sker inom samma lagringskonto.

En Copy Blob åtgärd kan utföra någon av följande åtgärder:

  • Kopiera en källblob till en målblob med ett annat namn. Målbloben kan vara en befintlig blob av samma blobtyp (block, tillägg eller sida) eller en ny blob som skapas av kopieringsåtgärden.
  • Kopiera en källblob till en målblob med samma namn, vilket ersätter målbloben. Den här typen av kopieringsåtgärd tar bort alla icke-obligatoriska block och skriver över målblobens metadata.
  • Kopiera en källfil i Azure File-tjänsten till en målblob. Målbloben kan vara en befintlig blockblob eller vara en ny blockblob som skapas av kopieringsåtgärden. Kopiering från filer till sidblobar eller tilläggsblobar stöds inte.
  • Kopiera en ögonblicksbild över dess basblob. Genom att befordra en ögonblicksbild till basblobens position kan du återställa en tidigare version av en blob.
  • Kopiera en ögonblicksbild till en målblob med ett annat namn. Den resulterande målbloben är en skrivbar blob och inte en ögonblicksbild.

Mer information om åtgärden, inklusive information om egenskaper, indextaggar, metadata och fakturering finns i Copy Blob Kopiera blobkommentarer.

Kopiera en blob med asynkron schemaläggning

Det här avsnittet ger en översikt över metoder som tillhandahålls av Azure Storage-klientbiblioteket för .NET för att utföra en kopieringsåtgärd med asynkron schemaläggning.

Följande metoder omsluter REST API-åtgärden Kopiera blob och påbörjar en asynkron kopia av data från källbloben:

Metoderna StartCopyFromUri och StartCopyFromUriAsync returnerar ett CopyFromUriOperation-objekt som innehåller information om kopieringsåtgärden. Dessa metoder används när du vill ha asynkron schemaläggning för en kopieringsåtgärd.

Kopiera en blob från en källa i Azure

Om du kopierar en blob i samma lagringskonto kan åtgärden slutföras synkront. Åtkomst till källbloben kan auktoriseras via Microsoft Entra-ID, en signatur för delad åtkomst (SAS) eller en kontonyckel. En alterativ synkron kopieringsåtgärd finns i Kopiera en blob från en url för källobjekt med .NET.

Om kopieringskällan är en blob i ett annat lagringskonto kan åtgärden slutföras asynkront. Källbloben måste antingen vara offentlig eller auktoriserad via SAS-token. SAS-token måste innehålla behörigheten Läs ('r'). Mer information om SAS-token finns i Delegera åtkomst med signaturer för delad åtkomst.

I följande exempel visas ett scenario för att kopiera en källblob från ett annat lagringskonto med asynkron schemaläggning. I det här exemplet skapar vi en källblob-URL med en bifogad SAS-token för användardelegering. Exemplet visar hur du genererar SAS-token med hjälp av klientbiblioteket, men du kan också ange en egen. Exemplet visar också hur du lånar källbloben under kopieringsåtgärden för att förhindra ändringar i bloben från en annan klient. Åtgärden Copy Blob sparar värdet för ETag källbloben när kopieringsåtgärden startar. Om värdet ETag ändras innan kopieringsåtgärden är klar misslyckas åtgärden.

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

Kommentar

SAS-token för användardelegering ger större säkerhet eftersom de är signerade med Microsoft Entra-autentiseringsuppgifter i stället för en kontonyckel. För att skapa en SAS-token för användardelegering behöver Microsoft Entra-säkerhetsobjektet lämpliga behörigheter. Auktoriseringskrav finns i Hämta användardelegeringsnyckel.

Kopiera en blob från en källa utanför Azure

Du kan utföra en kopieringsåtgärd på alla källobjekt som kan hämtas via HTTP GET-begäran på en viss URL, inklusive tillgängliga objekt utanför Azure. I följande exempel visas ett scenario för att kopiera en blob från en URL för tillgängligt källobjekt.

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

Kontrollera status för en kopieringsåtgärd

Om du vill kontrollera status för en Copy Blob åtgärd kan du anropa UpdateStatusAsync och parsa svaret för att hämta värdet för x-ms-copy-status huvudet.

I följande kodexempel visas hur du kontrollerar status för en kopieringsåtgärd:

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

Avbryt en kopieringsåtgärd

Om du avbryter en väntande Copy Blob åtgärd resulterar det i en målblob med noll längd. Metadata för målbloben har dock de nya värdena kopierade från källbloben eller anges uttryckligen under kopieringsåtgärden. Om du vill behålla de ursprungliga metadata från före kopian skapar du en ögonblicksbild av målbloben innan du anropar någon av kopieringsmetoderna.

Om du vill avbryta en väntande kopieringsåtgärd anropar du någon av följande åtgärder:

Dessa metoder omsluter rest-API-åtgärden Avbryt kopieringsblob , vilket avbryter en väntande Copy Blob åtgärd. Följande kodexempel visar hur du avbryter en väntande Copy Blob åtgärd:

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

Resurser

Mer information om hur du kopierar blobar med hjälp av Azure Blob Storage-klientbiblioteket för .NET finns i följande resurser.

Kodexempel

REST API-åtgärder

Azure SDK för .NET innehåller bibliotek som bygger på Azure REST API, så att du kan interagera med REST API-åtgärder via välbekanta .NET-paradigm. De klientbiblioteksmetoder som beskrivs i den här artikeln använder följande REST API-åtgärder:

Klientbiblioteksresurser

  • Den här artikeln är en del av utvecklarguiden för Blob Storage för .NET. Mer information finns i den fullständiga listan över utvecklarguideartiklar i Skapa din .NET-app.