Blob másolása aszinkron ütemezéssel a .NET használatával
Ez a cikk bemutatja, hogyan másolhat egy blobot aszinkron ütemezéssel a .NET-hez készült Azure Storage-ügyfélkódtár használatával. Egy blobot másolhat egy forrásból ugyanabban a tárfiókban, egy másik tárfiókban lévő forrásból, vagy bármely akadálymentes objektumból, amely egy adott URL-címen http GET kéréssel kérhető le. A függőben lévő másolási műveletet is megszakíthatja.
A cikkben tárgyalt ügyfélkódtár-metódusok a Blob REST API másolása műveletet használják, és akkor használhatók, ha aszinkron ütemezéssel szeretne másolatot készíteni. A legtöbb olyan másolási forgatókönyv esetében, ahol adatokat szeretne áthelyezni egy tárfiókba, és rendelkezik a forrásobjektum URL-címével, olvassa el a Blob másolása forrásobjektum URL-címéről a .NET-lel című témakört.
Előfeltételek
- Azure-előfizetés – hozzon létre egyet ingyenesen
- Azure Storage-fiók – tárfiók létrehozása
- Az operációs rendszer legújabb .NET SDK-ja . Mindenképpen szerezze be az SDK-t, és ne a futtatókörnyezetet.
Saját környezet beállítása
Ha nem rendelkezik meglévő projekttel, ez a szakasz bemutatja, hogyan állíthat be projektet a .NET-hez készült Azure Blob Storage ügyfélkódtár használatához. A lépések közé tartozik a csomagtelepítés, az irányelvek hozzáadása using
és egy engedélyezett ügyfélobjektum létrehozása. További részletekért tekintse meg az Azure Blob Storage és a .NET használatának első lépéseit.
Csomagok telepítése
A projektkönyvtárból telepítse az Azure Blob Storage- és Az Azure Identity-ügyfélkódtárak csomagjait a dotnet add package
paranccsal. Az Azure.Identity-csomagra az Azure-szolgáltatásokhoz való jelszó nélküli kapcsolatokhoz van szükség.
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity
Irányelvek hozzáadása using
Adja hozzá ezeket az using
irányelveket a kódfájl elejéhez:
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
A cikkben szereplő néhány példakód további using
irányelveket igényelhet.
Ügyfélobjektum létrehozása
Ha egy alkalmazást a Blob Storage-hoz szeretne csatlakoztatni, hozzon létre egy BlobServiceClient-példányt. Az alábbi példa bemutatja, hogyan hozhat létre ügyfélobjektumot DefaultAzureCredential
engedélyezés céljából:
public BlobServiceClient GetBlobServiceClient(string accountName)
{
BlobServiceClient client = new(
new Uri($"https://{accountName}.blob.core.windows.net"),
new DefaultAzureCredential());
return client;
}
A szolgáltatásügyfél regisztrálható a függőséginjektáláshoz egy .NET-alkalmazásban.
Ügyfélobjektumokat is létrehozhat adott tárolókhoz vagy blobokhoz. Az ügyfélobjektumok létrehozásáról és kezeléséről további információt az adaterőforrásokat kezelő ügyfélobjektumok létrehozása és kezelése című témakörben talál.
Engedélyezés
Az engedélyezési mechanizmusnak rendelkeznie kell a másolási művelet végrehajtásához vagy a függőben lévő másolat megszakításához szükséges engedélyekkel. A Microsoft Entra-azonosítóval való engedélyezéshez (ajánlott) a legkevésbé kiemelt Azure RBAC beépített szerepkör több tényezőtől függően változik. További információért tekintse meg a Blob másolása (REST API) vagy a Blob másolásának megszakítása (REST API) engedélyezési útmutatóját.
Blobok aszinkron ütemezéssel történő másolása
A Copy Blob
művelet aszinkron módon fejeződhet be, és a legjobb munkamennyiség alapján hajtható végre, ami azt jelenti, hogy a művelet nem garantáltan azonnal indul el vagy fejeződik be egy megadott időkereten belül. A másolási művelet a háttérben van ütemezve, és a kiszolgáló rendelkezésre álló erőforrásokkal rendelkezik. A művelet szinkron módon is befejeződhet, ha a másolat ugyanabban a tárfiókban történik.
A Copy Blob
művelet a következő műveletek bármelyikét hajthatja végre:
- Másolja a forrásblobot egy másik nevű célblobba. A célblob lehet ugyanahhoz a blobtípushoz tartozó meglévő blob (blokk, hozzáfűzés vagy oldal), vagy lehet a másolási művelet által létrehozott új blob.
- Másolja a forrásblobot egy célblobba ugyanazzal a névvel, amely a célblobot helyettesíti. Ez a másolási művelet eltávolítja a nem véglegesített blokkokat, és felülírja a cél blob metaadatait.
- Másolja a forrásfájlt az Azure File service-ben egy célblobba. A célblob lehet meglévő blokkblob, vagy a másolási művelet által létrehozott új blokkblob. A fájlokról lapblobok vagy hozzáfűző blobok másolása nem támogatott.
- Pillanatkép másolása az alapblobra. Ha előléptet egy pillanatképet az alapblob helyére, visszaállíthatja a blob egy korábbi verzióját.
- Pillanatkép másolása másik nevű célblobba. Az eredményként kapott célblob egy írható blob, és nem pillanatkép.
Ha többet szeretne megtudni a műveletről, beleértve a Copy Blob
tulajdonságokra, indexcímkékre, metaadatokra és számlázásra vonatkozó információkat, olvassa el a Blob-megjegyzések másolása című témakört.
Blob másolása aszinkron ütemezéssel
Ez a szakasz áttekintést nyújt a .NET-hez készült Azure Storage-ügyfélkódtár által a másolási művelet aszinkron ütemezéssel történő végrehajtásához.
A következő metódusok burkolják a Blob REST API másolása műveletet, és elindítják az adatok aszinkron másolatát a forrásblobból:
A StartCopyFromUri
metódusok StartCopyFromUriAsync
egy CopyFromUriOperation objektumot adnak vissza, amely a másolási művelettel kapcsolatos információkat tartalmazza. Ezek a metódusok akkor használatosak, ha a másolási művelet aszinkron ütemezését szeretné használni.
Blob másolása egy Azure-beli forrásból
Ha egy blobot másol ugyanabban a tárfiókban, a művelet szinkron módon is befejeződhet. A forrásblobhoz való hozzáférés a Microsoft Entra-azonosítón, a közös hozzáférésű jogosultságkódon (SAS) vagy egy fiókkulcson keresztül engedélyezhető. Váltakozó szinkron másolási művelet esetén lásd : Blob másolása forrásobjektum URL-címéről .NET-tel.
Ha a másolási forrás egy másik tárfiókban lévő blob, a művelet aszinkron módon fejeződhet be. A forrásblobnak nyilvánosnak vagy SAS-jogkivonaton keresztül engedélyezettnek kell lennie. Az SAS-jogkivonatnak tartalmaznia kell az olvasási ('r') engedélyt. Az SAS-jogkivonatokról további információt a Megosztott hozzáférésű jogosultságkódokkal rendelkező hozzáférés delegálása című témakörben talál.
Az alábbi példa egy másik tárfiókból származó forrásblob aszinkron ütemezéssel történő másolásának forgatókönyvét mutatja be. Ebben a példában létrehozunk egy forrás blob URL-címet egy hozzáfűzött felhasználódelegálási SAS-jogkivonattal. A példa bemutatja, hogyan hozhatja létre az SAS-jogkivonatot az ügyfélkódtár használatával, de sajátot is megadhat. A példa azt is bemutatja, hogyan adhatja bérbe a forrásblobot a másolási művelet során, hogy megakadályozza a blob módosítását egy másik ügyféltől. A Copy Blob
művelet a másolási művelet indításakor menti ETag
a forrásblob értékét. Ha az ETag
érték a másolási művelet befejeződése előtt módosul, a művelet meghiúsul.
//-------------------------------------------------
// 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();
}
Feljegyzés
A felhasználói delegálási SAS-jogkivonatok nagyobb biztonságot nyújtanak, mivel fiókkulcs helyett Microsoft Entra hitelesítő adatokkal vannak aláírva. Felhasználói delegálási SAS-jogkivonat létrehozásához a Microsoft Entra biztonsági tagnak megfelelő engedélyekre van szüksége. Az engedélyezési követelményekkel kapcsolatban lásd: Felhasználódelegálási kulcs lekérése.
Blob másolása az Azure-on kívüli forrásból
Másolási műveletet bármely olyan forrásobjektumon végrehajthat, amely http GET kéréssel kérhető le egy adott URL-címen, beleértve az Azure-on kívüli akadálymentes objektumokat is. Az alábbi példa egy blob akadálymentes forrásobjektum URL-címéről történő másolásának forgatókönyvét mutatja be.
//-------------------------------------------------
// 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();
}
Másolási művelet állapotának ellenőrzése
Egy Copy Blob
művelet állapotának ellenőrzéséhez meghívhatja az UpdateStatusAsync parancsot, és elemezheti a választ a fejléc értékének x-ms-copy-status
lekéréséhez.
Az alábbi példakód bemutatja, hogyan ellenőrizheti a másolási művelet állapotát:
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}");
}
Másolási művelet megszakítása
A függőben lévő Copy Blob
művelet megszakítása nulla hosszúságú célblobot eredményez. A célblob metaadatai azonban a forrásblobból másolt vagy explicit módon beállított új értékeket tartalmaznak a másolási művelet során. Az eredeti metaadatok másolás előtti megőrzéséhez készítsen pillanatképet a célblobról, mielőtt meghívja az egyik másolási metódust.
Függőben lévő másolási művelet megszakításához hívja meg az alábbi műveletek egyikét:
Ezek a metódusok lezárják a Blob REST API megszakítása műveletet, amely megszakít egy függőben lévő Copy Blob
műveletet. Az alábbi példakód bemutatja, hogyan szakíthat meg függőben lévő Copy Blob
műveletet:
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");
}
}
}
Források
Ha többet szeretne megtudni a blobok .NET-hez készült Azure Blob Storage-ügyfélkódtár használatával történő másolásáról, tekintse meg az alábbi erőforrásokat.
Kódminták
REST API-műveletek
A .NET-hez készült Azure SDK olyan kódtárakat tartalmaz, amelyek az Azure REST API-ra épülnek, lehetővé téve a REST API-műveletek használatát ismerős .NET-paradigmákon keresztül. A cikkben tárgyalt ügyfélkódtár-metódusok a következő REST API-műveleteket használják:
Ügyfélkódtár erőforrásai
Kapcsolódó tartalom
- Ez a cikk a .NET-hez készült Blob Storage fejlesztői útmutató része. További információért tekintse meg a .NET-alkalmazás buildeléséhez kapcsolódó fejlesztői útmutatók teljes listáját.