Menyalin blob dengan penjadwalan asinkron menggunakan .NET
Artikel ini memperlihatkan cara menyalin blob dengan penjadwalan asinkron menggunakan pustaka klien Azure Storage untuk .NET. Anda dapat menyalin blob dari sumber dalam akun penyimpanan yang sama, dari sumber di akun penyimpanan yang berbeda, atau dari objek yang dapat diakses yang diambil melalui permintaan HTTP GET pada URL tertentu. Anda juga dapat membatalkan operasi penyalinan yang tertunda.
Metode pustaka klien yang tercakup dalam artikel ini menggunakan operasi Copy Blob REST API, dan dapat digunakan saat Anda ingin melakukan salinan dengan penjadwalan asinkron. Untuk sebagian besar skenario penyalinan tempat Anda ingin memindahkan data ke akun penyimpanan dan memiliki URL untuk objek sumber, lihat Menyalin blob dari URL objek sumber dengan .NET.
Prasyarat
- Langganan Azure - buat akun secara gratis
- Akun penyimpanan Azure - buat akun penyimpanan
- .NET SDK terbaru untuk sistem operasi Anda. Pastikan untuk mendapatkan SDK alih-alih runtime.
Menyiapkan lingkungan Anda
Jika Anda tidak memiliki proyek yang sudah ada, bagian ini menunjukkan kepada Anda cara menyiapkan proyek untuk bekerja dengan pustaka klien Azure Blob Storage untuk .NET. Langkah-langkahnya termasuk penginstalan paket, menambahkan arahan using
, dan membuat objek klien resmi. Untuk detailnya, lihat Mulai menggunakan Azure Blob Storage dan .NET.
Memasang paket
Dari direktori proyek Anda, instal paket untuk pustaka klien Azure Blob Storage dan Azure Identity menggunakan dotnet add package
perintah . Paket Azure.Identity diperlukan untuk koneksi tanpa kata sandi ke layanan Azure.
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity
Tambahkan direktif using
Tambahkan arahan ini using
ke bagian atas file kode Anda:
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
Beberapa contoh kode dalam artikel ini mungkin memerlukan arahan tambahan using
.
Membuat objek klien
Untuk menyambungkan aplikasi ke Blob Storage, buat instans BlobServiceClient. Contoh berikut menunjukkan cara membuat objek klien menggunakan DefaultAzureCredential
untuk otorisasi:
public BlobServiceClient GetBlobServiceClient(string accountName)
{
BlobServiceClient client = new(
new Uri($"https://{accountName}.blob.core.windows.net"),
new DefaultAzureCredential());
return client;
}
Anda dapat mendaftarkan klien layanan untuk injeksi dependensi di aplikasi .NET.
Anda juga dapat membuat objek klien untuk kontainer atau blob tertentu. Untuk mempelajari selengkapnya tentang membuat dan mengelola objek klien, lihat Membuat dan mengelola objek klien yang berinteraksi dengan sumber daya data.
Authorization
Mekanisme otorisasi harus memiliki izin yang diperlukan untuk melakukan operasi penyalinan, atau membatalkan salinan yang tertunda. Untuk otorisasi dengan MICROSOFT Entra ID (disarankan), peran bawaan Azure RBAC yang paling tidak istimewa bervariasi berdasarkan beberapa faktor. Untuk mempelajari lebih lanjut, lihat panduan otorisasi untuk Salin Blob (REST API) atau Batalkan Salin Blob (REST API).
Tentang menyalin blob dengan penjadwalan asinkron
Copy Blob
Operasi dapat selesai secara asinkron dan dilakukan berdasarkan upaya terbaik, yang berarti bahwa operasi tidak dijamin untuk segera dimulai atau diselesaikan dalam jangka waktu yang ditentukan. Operasi salin dijadwalkan di latar belakang dan dilakukan karena server memiliki sumber daya yang tersedia. Operasi dapat diselesaikan secara sinkron jika salinan terjadi dalam akun penyimpanan yang sama.
Copy Blob
Operasi dapat melakukan salah satu tindakan berikut:
- Salin blob sumber ke blob tujuan dengan nama yang berbeda. Blob tujuan dapat berupa blob yang ada dari jenis blob yang sama (blok, tambahkan, atau halaman), atau blob baru yang dibuat oleh operasi salin.
- Salin blob sumber ke blob tujuan dengan nama yang sama, yang menggantikan blob tujuan. Jenis operasi salin ini menghapus blok yang tidak dikomit dan menimpa metadata blob tujuan.
- Salin file sumber dalam layanan File Azure ke blob tujuan. Blob tujuan bisa menjadi blob blok yang ada, atau bisa menjadi blob blok baru yang dibuat oleh operasi salin. Menyalin dari file ke blob halaman atau menambahkan blob tidak didukung.
- Salin snapshot di atas blob dasarnya. Dengan mempromosikan snapshot ke posisi blob dasar, Anda dapat memulihkan versi blob yang lebih lama.
- Salin blob sumber ke blob tujuan dengan nama yang berbeda. Blob tujuan yang dihasilkan adalah blob yang dapat ditulis dan bukan snapshot.
Untuk mempelajari selengkapnya tentang Copy Blob
operasi ini, termasuk informasi tentang properti, tag indeks, metadata, dan penagihan, lihat Menyalin komentar Blob.
Menyalin blob dengan penjadwalan asinkron
Bagian ini memberikan gambaran umum metode yang disediakan oleh pustaka klien Azure Storage untuk .NET untuk melakukan operasi salin dengan penjadwalan asinkron.
Metode berikut membungkus operasi Copy Blob REST API, dan memulai salinan data asinkron dari blob sumber:
Metode StartCopyFromUri
dan StartCopyFromUriAsync
mengembalikan objek CopyFromUriOperation yang berisi informasi tentang operasi salin. Metode ini digunakan ketika Anda ingin penjadwalan asinkron untuk operasi salin.
Menyalin blob dari sumber dalam Azure
Jika Anda menyalin blob dalam akun penyimpanan yang sama, operasi dapat diselesaikan secara sinkron. Akses ke blob sumber dapat diotorisasi melalui ID Microsoft Entra, tanda tangan akses bersama (SAS), atau kunci akun. Untuk operasi penyalinan sinkron alteratif, lihat Menyalin blob dari URL objek sumber dengan .NET.
Jika sumber salin adalah blob di akun penyimpanan yang berbeda, operasi dapat diselesaikan secara asinkron. Blob sumber harus publik atau diotorisasi melalui token SAS. Token SAS perlu menyertakan izin Baca ('r'). Untuk mempelajari selengkapnya tentang token SAS, lihat Mendelegasikan akses dengan tanda tangan akses bersama.
Contoh berikut menunjukkan skenario untuk menyalin blob sumber dari akun penyimpanan yang berbeda dengan penjadwalan asinkron. Dalam contoh ini, kami membuat URL blob sumber dengan token SAS delegasi pengguna yang ditambahkan. Contoh menunjukkan cara membuat token SAS menggunakan pustaka klien, tetapi Anda juga dapat menyediakannya sendiri. Contohnya juga menunjukkan cara menyewa blob sumber selama operasi salin untuk mencegah perubahan pada blob dari klien yang berbeda. Copy Blob
Operasi menyimpan ETag
nilai blob sumber saat operasi penyalinan dimulai. ETag
Jika nilai diubah sebelum operasi salin selesai, operasi gagal.
//-------------------------------------------------
// 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();
}
Catatan
Token SAS delegasi pengguna menawarkan keamanan yang lebih besar, karena ditandatangani dengan kredensial Microsoft Entra alih-alih kunci akun. Untuk membuat token SAS delegasi pengguna, perwakilan keamanan Microsoft Entra memerlukan izin yang sesuai. Untuk persyaratan otorisasi, lihat Mendapatkan Kunci Delegasi Pengguna.
Menyalin blob dari sumber di luar Azure
Anda dapat melakukan operasi salin pada objek sumber apa pun yang dapat diambil melalui permintaan HTTP GET pada URL tertentu, termasuk objek yang dapat diakses di luar Azure. Contoh berikut menunjukkan skenario untuk menyalin blob dari URL objek sumber yang dapat diakses.
//-------------------------------------------------
// 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();
}
Memeriksa status operasi penyalinan
Untuk memeriksa status Copy Blob
operasi, Anda dapat memanggil UpdateStatusAsync dan mengurai respons untuk mendapatkan nilai untuk x-ms-copy-status
header.
Contoh kode berikut menunjukkan cara memeriksa status operasi penyalinan:
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}");
}
Membatalkan operasi salin
Membatalkan operasi yang tertunda Copy Blob
menghasilkan blob tujuan dengan panjang nol. Namun, metadata untuk blob tujuan memiliki nilai baru yang disalin dari blob sumber atau diatur secara eksplisit selama operasi salin. Untuk menjaga metadata asli dari sebelum salinan, buat snapshot dari blob tujuan sebelum memanggil salah satu metode salin.
Untuk membatalkan operasi penyalinan yang tertunda, panggil salah satu operasi berikut:
Metode ini membungkus operasi Abort Copy Blob REST API, yang membatalkan operasi yang tertunda Copy Blob
. Contoh kode berikut menunjukkan cara membatalkan operasi yang tertunda Copy Blob
:
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");
}
}
}
Sumber
Untuk mempelajari selengkapnya tentang menyalin blob menggunakan pustaka klien Azure Blob Storage untuk .NET, lihat sumber daya berikut ini.
Sampel kode
Operasi REST API
Azure SDK untuk .NET berisi pustaka yang dibangun di atas Azure REST API, memungkinkan Anda berinteraksi dengan operasi REST API melalui paradigma .NET yang sudah dikenal. Metode pustaka klien yang tercakup dalam artikel ini menggunakan operasi REST API berikut:
- Salin Blob (REST API)
- Batalkan Salin Blob (REST API)
Sumber daya pustaka klien
Konten terkait
- Artikel ini adalah bagian dari panduan pengembang Blob Storage untuk .NET. Untuk mempelajari lebih lanjut, lihat daftar lengkap artikel panduan pengembang di Membangun aplikasi .NET Anda.