Управление свойствами контейнеров и метаданными с помощью .NET
Помимо данных, которые они содержат, контейнеры BLOB-объектов поддерживают свойства системы и пользовательские метаданные. В этой статье рассматривается управление свойствами системы и определяемыми пользователем метаданными с помощью клиентской библиотеки хранилища Azure для .NET.
Сведения о свойствах и метаданных
Свойства системы: свойства системы есть у каждого ресурса хранилища BLOB-объектов. Некоторые из них можно считать или задать, некоторые — только считать. На самом деле, некоторые свойства системы соответствуют определенным стандартным заголовкам HTTP. Клиентская библиотека службы хранилища Azure для .NET сохраняет эти свойства.
Определяемые пользователем метаданные: такие метаданные состоят из одной или нескольких пар "имя-значение", которые можно указать для ресурса хранилища BLOB-объектов. Вы можете использовать метаданные для хранения дополнительных значений с помощью ресурса хранилища. Значения метаданных предназначены только для ваших собственных целей и не влияют на поведение ресурса.
Пары имен и значений метаданных являются допустимыми HTTP-заголовками, поэтому они должны соответствовать всем ограничениям для HTTP-заголовков. Имена метаданных должны представлять собой допустимые имена HTTP-заголовков и допустимые идентификаторы C#, могут содержать только символы ASCII и должны обрабатываться без учета регистра. Значения метаданных, содержащие символы вне кодировки ASCII, должны быть в кодировке Base64 или в кодировке URL.
Получение свойств контейнера
Чтобы получить свойства контейнера, вызовите один из следующих методов:
В следующем примере кода извлекаются системные свойства контейнера, а значения некоторых свойств выводятся в окно консоли.
private static async Task ReadContainerPropertiesAsync(BlobContainerClient container)
{
try
{
// Fetch some container properties and write out their values.
var properties = await container.GetPropertiesAsync();
Console.WriteLine($"Properties for container {container.Uri}");
Console.WriteLine($"Public access level: {properties.Value.PublicAccess}");
Console.WriteLine($"Last modified time in UTC: {properties.Value.LastModified}");
}
catch (RequestFailedException e)
{
Console.WriteLine($"HTTP error code {e.Status}: {e.ErrorCode}");
Console.WriteLine(e.Message);
Console.ReadLine();
}
}
Задание и извлечение метаданных
Метаданные можно указать как одну или несколько пар "имя-значение" для BLOB-ресурса или ресурса контейнера. Чтобы задать метаданные, добавьте пары "имя-значение" в объект IDictionary, а затем вызовите один из следующих методов для записи значений:
Имя метаданных должно соответствовать соглашениям об именовании идентификаторов C#. Имена метаданных сохраняют регистр, с которым они были созданы, однако при задании и чтении регистр не учитывается. Если для ресурса передается несколько заголовков метаданных с одним и тем же именем, то в хранилище BLOB-объектов соответствующие два значения оказываются разделены запятыми и объединены, и возвращается код HTTP-ответа 200 (ОК).
В следующем примере кода задаются метаданные для контейнера.
public static async Task AddContainerMetadataAsync(BlobContainerClient container)
{
try
{
IDictionary<string, string> metadata =
new Dictionary<string, string>();
// Add some metadata to the container.
metadata.Add("docType", "textDocuments");
metadata.Add("category", "guidance");
// Set the container's metadata.
await container.SetMetadataAsync(metadata);
}
catch (RequestFailedException e)
{
Console.WriteLine($"HTTP error code {e.Status}: {e.ErrorCode}");
Console.WriteLine(e.Message);
Console.ReadLine();
}
}
Для получения метаданных вызовите один из следующих методов:
Затем прочитайте значения, как показано в примере ниже.
public static async Task ReadContainerMetadataAsync(BlobContainerClient container)
{
try
{
var properties = await container.GetPropertiesAsync();
// Enumerate the container's metadata.
Console.WriteLine("Container metadata:");
foreach (var metadataItem in properties.Value.Metadata)
{
Console.WriteLine($"\tKey: {metadataItem.Key}");
Console.WriteLine($"\tValue: {metadataItem.Value}");
}
}
catch (RequestFailedException e)
{
Console.WriteLine($"HTTP error code {e.Status}: {e.ErrorCode}");
Console.WriteLine(e.Message);
Console.ReadLine();
}
}