Azure Depolama'da Verileri Depolama ve ErişmeXamarin.Forms
Azure Depolama yapılandırılmamış ve yapılandırılmış verileri depolamak için kullanılabilen ölçeklenebilir bir bulut depolama çözümüdür. Bu makalede, Azure Depolama'da metin ve ikili verileri depolamak için nasıl kullanılacağı Xamarin.Forms ve verilere nasıl eriş kullanılacağı gösterilmektedir.
Azure Depolama dört depolama hizmeti sağlar:
- Blob Depolama. Blob, yedekler, sanal makineler, medya dosyaları veya belgeler gibi metin veya ikili veriler olabilir.
- Tablo Depolama bir NoSQL anahtar-öznitelik deposudur.
- Kuyruk Depolama, iş akışı işleme ve bulut hizmetleri arasındaki iletişim için bir mesajlaşma hizmetidir.
- Dosya Depolama, SMB protokolunu kullanarak paylaşılan depolama sağlar.
İki tür depolama hesabı vardır:
- Genel amaçlı depolama hesapları, Azure Depolama hizmetlerine tek bir hesaptan erişim sağlar.
- Blob depolama hesabı, blobları depolamak için özel bir depolama hesabıdır. Bu hesap türü yalnızca blob verilerini depolamanız gerektiğinde önerilir.
Bu makalede ve örnek uygulamayla birlikte blob depolamaya görüntü ve metin dosyalarının yüklenmesi ve indirilmesi gösterilmektedir. Buna ek olarak, blob depolamadan dosya listesini alma ve dosyaları silme işlemleri de gösterilmektedir.
Azure Depolama hakkında daha fazla bilgi için bkz. Depolama giriş.
Not
Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Blob Depolama giriş
Blob depolama, aşağıdaki diyagramda gösterilen üç bileşenden oluşur:
Azure Depolama'a tüm erişim bir depolama hesabı üzerinden yapılır. Depolama hesabı sınırsız sayıda kapsayıcı içerebilir ve kapsayıcı, depolama hesabının kapasite sınırına kadar sınırsız sayıda blob depolayabilir.
Blob, herhangi bir türde ve boyutta bir dosyadır. Azure Depolama üç farklı blob türünü destekler:
- Blok blobları bulut nesnelerinin akışını ve depolanması için iyileştirilmiştir ve yedeklemeleri, medya dosyalarını, belgeleri vb. depolamak için iyi bir seçimdir. Blok bloblarının boyutu 195 Gb'a kadar olabilir.
- Ekleme blobları blok bloblarına benzer ancak günlük kaydı gibi ekleme işlemleri için iyileştirilmiştir. Ekleme bloblarının boyutu en fazla 195 Gb olabilir.
- Sayfa blobları sık sık okuma/yazma işlemleri için iyileştirilmiştir ve genellikle sanal makineleri ve disklerini depolamak için kullanılır. Sayfa bloblarının boyutu en fazla 1 Tb olabilir.
Not
Blob depolama hesaplarının blok ve ekleme bloblarını desteklediğini ancak sayfa bloblarını desteklemediğini unutmayın.
Blob, Azure Depolama'a yüklenir ve bayt akışı olarak Azure Depolama'dan indirilir. Bu nedenle, dosyaların karşıya yüklenmeden önce bir bayt akışına dönüştürülmesi ve indirmeden sonra özgün gösterimlerine geri dönüştürülmesi gerekir.
Azure Depolama'da depolanan her nesnenin benzersiz bir URL adresi vardır. Depolama hesabı adı bu adresin alt etki alanını, alt etki alanı ve etki alanı adı birleşimi ise depolama hesabı için bir uç nokta oluşturur. Örneğin, depolama hesabınızın adı mystorageaccount ise, depolama hesabının varsayılan blob uç noktası olur https://mystorageaccount.blob.core.windows.net
.
Bir depolama hesabındaki bir nesneye erişmek için gerekli URL, nesnenin depolama hesabındaki konumunun uç noktaya eklenmesiyle oluşturulur. Örneğin, bir blob adresi biçiminde https://mystorageaccount.blob.core.windows.net/mycontainer/myblob
olacaktır.
Ayarlama
Azure Depolama hesabını bir Xamarin.Forms uygulamayla tümleştirme işlemi aşağıdaki gibidir:
- Depolama hesabı oluşturma. Daha fazla bilgi için bkz. Depolama hesabı oluşturma.
- Azure Depolama İstemci Kitaplığı'nıXamarin.Forms uygulamaya ekleyin.
- Depolama bağlantı dizesi yapılandırın. Daha fazla bilgi için bkz. Azure Depolama'a Bağlan.
- Azure Depolama erişecek sınıflara ve
Microsoft.WindowsAzure.Storage.Blob
ad alanları içinMicrosoft.WindowsAzure.Storage
yönergeler ekleyinusing
.
Azure Depolama’ya bağlanma
Depolama hesabı kaynaklarından yapılan her isteğin kimliği doğrulanmalıdır. Bloblar anonim kimlik doğrulamasını destekleyecek şekilde yapılandırılabilir ancak bir uygulamanın depolama hesabıyla kimlik doğrulaması yapmak için kullanabileceği iki ana yaklaşım vardır:
- Paylaşılan Anahtar. Bu yaklaşım, depolama hizmetlerine erişmek için Azure Depolama hesap adını ve hesap anahtarını kullanır. Depolama hesabına oluşturma işleminde paylaşılan anahtar kimlik doğrulaması için kullanılabilecek iki özel anahtar atanır.
- Paylaşılan Erişim İmzası. Bu, geçerli olduğu süre boyunca, belirttiği izinlerle bir depolama kaynağına temsilci erişimi sağlayan bir URL'ye eklenebilen bir belirteçtir.
Bir uygulamadan Azure Depolama kaynaklarına erişmek için gereken kimlik doğrulama bilgilerini içeren Bağlan ion dizeleri belirtilebilir. Ayrıca, Visual Studio'dan Azure depolama öykünücüsine bağlanmak için bir bağlantı dizesi yapılandırılabilir.
Not
Azure Depolama bir bağlantı dizesi HTTP ve HTTPS desteği sunar. Ancak HTTPS kullanılması önerilir.
Azure Depolama Öykünücüsü'ne Bağlan
Azure depolama öykünücüsü, geliştirme amacıyla Azure blobu, kuyruğu ve tablo hizmetlerini öykünen yerel bir ortam sağlar.
Azure depolama öykünücüsine bağlanmak için aşağıdaki bağlantı dizesi kullanılmalıdır:
UseDevelopmentStorage=true
Azure depolama öykünücüsü hakkında daha fazla bilgi için bkz . Geliştirme ve test için Azure depolama öykünücüsü kullanma.
Paylaşılan Anahtar Kullanarak Azure Depolama'a Bağlan
Paylaşılan anahtarla Azure Depolama bağlanmak için aşağıdaki bağlantı dizesi biçimi kullanılmalıdır:
DefaultEndpointsProtocol=[http|https];AccountName=myAccountName;AccountKey=myAccountKey
myAccountName
depolama hesabınızın adıyla değiştirilmelidir ve myAccountKey
iki hesap erişim anahtarınızdan biriyle değiştirilmelidir.
Not
Paylaşılan anahtar kimlik doğrulaması kullanılırken, hesap adınız ve hesap anahtarınız uygulamanızı kullanan her kişiye dağıtılır ve bu da depolama hesabına tam okuma/yazma erişimi sağlar. Bu nedenle, paylaşılan anahtar kimlik doğrulamasını yalnızca test amacıyla kullanın ve anahtarları hiçbir zaman diğer kullanıcılara dağıtmayın.
Paylaşılan Erişim İmzası kullanarak Azure Depolama'a Bağlan
Sas ile Azure Depolama bağlanmak için aşağıdaki bağlantı dizesi biçimi kullanılmalıdır:
BlobEndpoint=myBlobEndpoint;SharedAccessSignature=mySharedAccessSignature
myBlobEndpoint
blob uç noktanızın mySharedAccessSignature
URL'si ile ve SAS'nizle değiştirilmelidir. SAS, kaynağa erişmek için protokolü, hizmet uç noktasını ve kimlik bilgilerini sağlar.
Not
Üretim uygulamaları için SAS kimlik doğrulaması önerilir. Ancak, bir üretim uygulamasında SAS, uygulamayla birlikte paketlenmek yerine isteğe bağlı olarak bir arka uç hizmetinden alınmalıdır.
Paylaşılan Erişim İmzaları hakkında daha fazla bilgi için bkz . Paylaşılan Erişim İmzalarını (SAS) Kullanma.
Kapsayıcı Oluşturma
GetContainer
yöntemi, adlandırılmış bir kapsayıcıya başvuru almak için kullanılır. Bu başvuru daha sonra kapsayıcıdan blob almak veya kapsayıcıya blob eklemek için kullanılabilir. Aşağıdaki kod örneği yöntemini gösterir GetContainer
:
static CloudBlobContainer GetContainer(ContainerType containerType)
{
var account = CloudStorageAccount.Parse(Constants.StorageConnection);
var client = account.CreateCloudBlobClient();
return client.GetContainerReference(containerType.ToString().ToLower());
}
CloudStorageAccount.Parse
yöntemi bir bağlantı dizesi ayrıştırarak depolama hesabını temsil eden bir CloudStorageAccount
örnek döndürür. Kapsayıcıları CloudBlobClient
ve blobları almak için kullanılan bir örnek, yöntemi tarafından CreateCloudBlobClient
oluşturulur. GetContainerReference
yöntemi, çağrı yöntemine döndürülmeden önce belirtilen kapsayıcıyı örnek CloudBlobContainer
olarak alır. Bu örnekte kapsayıcı adı, küçük harfli bir dizeye dönüştürülen numaralandırma değeridir ContainerType
.
Not
Kapsayıcı adları küçük harfli olmalı ve harf veya sayı ile başlamalıdır. Buna ek olarak, bunlar yalnızca harf, sayı ve tire karakteri içerebilir ve 3 ile 63 karakter uzunluğunda olmalıdır.
GetContainer
yöntemi aşağıdaki gibi çağrılır:
var container = GetContainer(containerType);
Daha CloudBlobContainer
sonra örnek, henüz mevcut değilse kapsayıcı oluşturmak için kullanılabilir:
await container.CreateIfNotExistsAsync();
Varsayılan olarak, yeni oluşturulan bir kapsayıcı özeldir. Bu, kapsayıcıdan blobları almak için bir depolama erişim anahtarının belirtilmesi gerektiği anlamına gelir. Kapsayıcı içinde blob oluşturma hakkında bilgi için bkz . Kapsayıcı oluşturma.
Kapsayıcıya Veri Yükleme
UploadFileAsync
yöntemi, blob depolamaya bayt verisi akışı yüklemek için kullanılır ve aşağıdaki kod örneğinde gösterilmiştir:
public static async Task<string> UploadFileAsync(ContainerType containerType, Stream stream)
{
var container = GetContainer(containerType);
await container.CreateIfNotExistsAsync();
var name = Guid.NewGuid().ToString();
var fileBlob = container.GetBlockBlobReference(name);
await fileBlob.UploadFromStreamAsync(stream);
return name;
}
Bir kapsayıcı başvurusu aldıktan sonra yöntemi, henüz yoksa kapsayıcıyı oluşturur. Ardından benzersiz bir blob adı olarak davranacak yeni Guid
bir blob oluşturulur ve örnek olarak bir CloudBlockBlob
blob bloğu başvurusu alınır. Daha sonra veri akışı, blob henüz yoksa blobu oluşturan veya varsa üzerine yazan yöntemi kullanılarak UploadFromStreamAsync
bloba yüklenir.
Bir dosyanın bu yöntem kullanılarak blob depolamaya yüklenebilmesi için önce bayt akışına dönüştürülmesi gerekir. Bu, aşağıdaki kod örneğinde gösterilmiştir:
var byteData = Encoding.UTF8.GetBytes(text);
uploadedFilename = await AzureStorage.UploadFileAsync(ContainerType.Text, new MemoryStream(byteData));
Veriler text
bir bayt dizisine dönüştürülür ve ardından yöntemine UploadFileAsync
geçirilen bir akış olarak sarmalanır.
Kapsayıcıdan Veri İndirme
GetFileAsync
yöntemi, Azure Depolama'dan blob verilerini indirmek için kullanılır ve aşağıdaki kod örneğinde gösterilir:
public static async Task<byte[]> GetFileAsync(ContainerType containerType, string name)
{
var container = GetContainer(containerType);
var blob = container.GetBlobReference(name);
if (await blob.ExistsAsync())
{
await blob.FetchAttributesAsync();
byte[] blobBytes = new byte[blob.Properties.Length];
await blob.DownloadToByteArrayAsync(blobBytes, 0);
return blobBytes;
}
return null;
}
Bir kapsayıcı başvurusu aldıktan sonra yöntemi, depolanan veriler için bir blob başvurusu alır. Blob varsa, özellikleri yöntemi tarafından FetchAttributesAsync
alınır. Doğru boyutta bir bayt dizisi oluşturulur ve blob, çağıran yönteme döndürülen bir bayt dizisi olarak indirilir.
Blob bayt verileri indirildikten sonra özgün gösterimine dönüştürülmelidir. Bu, aşağıdaki kod örneğinde gösterilmiştir:
var byteData = await AzureStorage.GetFileAsync(ContainerType.Text, uploadedFilename);
string text = Encoding.UTF8.GetString(byteData);
Bayt dizisi, UTF8 ile kodlanmış bir dizeye GetFileAsync
geri dönüştürülmeden önce yöntemiyle Azure Depolama'dan alınır.
Kapsayıcıdaki Verileri Listeleme
GetFilesListAsync
yöntemi, bir kapsayıcıda depolanan blobların listesini almak için kullanılır ve aşağıdaki kod örneğinde gösterilir:
public static async Task<IList<string>> GetFilesListAsync(ContainerType containerType)
{
var container = GetContainer(containerType);
var allBlobsList = new List<string>();
BlobContinuationToken token = null;
do
{
var result = await container.ListBlobsSegmentedAsync(token);
if (result.Results.Count() > 0)
{
var blobs = result.Results.Cast<CloudBlockBlob>().Select(b => b.Name);
allBlobsList.AddRange(blobs);
}
token = result.ContinuationToken;
} while (token != null);
return allBlobsList;
}
Bir kapsayıcı başvurusu aldıktan sonra yöntemi, kapsayıcı içindeki bloblara başvuru almak için kapsayıcının ListBlobsSegmentedAsync
yöntemini kullanır. yöntemi tarafından ListBlobsSegmentedAsync
döndürülen sonuçlar, örneği değilken BlobContinuationToken
null
numaralandırılır. Her blob, değeri koleksiyona eklenmeden önce blobun özelliğine erişmek Name
için döndürülen IListBlobItem
blobdan allBlobsList
'CloudBlockBlob
a atılır. BlobContinuationToken
Örnek olduğundanull
, son blob adı döndürülür ve yürütme döngüden çıkar.
Kapsayıcıdan Veri Silme
DeleteFileAsync
yöntemi, kapsayıcıdan bir blobu silmek için kullanılır ve aşağıdaki kod örneğinde gösterilir:
public static async Task<bool> DeleteFileAsync(ContainerType containerType, string name)
{
var container = GetContainer(containerType);
var blob = container.GetBlobReference(name);
return await blob.DeleteIfExistsAsync();
}
Bir kapsayıcı başvurusu aldıktan sonra yöntemi, belirtilen blob için bir blob başvurusu alır. Blob daha sonra yöntemiyle DeleteIfExistsAsync
silinir.