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
- Azure-prenumeration – skapa en kostnadsfritt
- Azure Storage-konto – skapa ett lagringskonto
- Senaste .NET SDK för operativsystemet. Se till att hämta SDK:et och inte körningen.
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:
- Kopiera blob (REST API)
- Avbryt kopieringsblob (REST API)
Klientbiblioteksresurser
Relaterat innehåll
- 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.