Проверка наличия большого двоичного объекта в хранилище Azure
У меня очень простой вопрос (я надеюсь!)- Я просто хочу узнать, существует ли blob (с именем, которое я определил) в определенном контейнере. Я буду загружать его, если он существует, а если нет, то я сделаю что-то еще.
Я сделал некоторый поиск по интертрубам и, по-видимому, раньше была функция под названием DoesExist или что-то подобное... но, как и во многих API Azure, это больше не кажется там (или если это так, имеет очень умно замаскированный имя.)
8 ответов:
новый API имеет .Существует() вызов функции. Просто убедитесь, что вы используете
GetBlockBlobReference
, который не выполняет вызов к серверу. Это делает функцию так же просто, как:public static bool BlobExistsOnCloud(CloudBlobClient client, string containerName, string key) { return client.GetContainerReference(containerName) .GetBlockBlobReference(key) .Exists(); }
Примечание: этот ответ устарел. Пожалуйста, смотрите ответ Ричарда для простого способа проверить наличие
нет, вы не пропустите что-то простое... мы проделали хорошую работу, скрыв этот метод в новой библиотеке StorageClient. :)
Я просто написал сообщение в блоге, чтобы ответить на ваш вопрос:http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob.
короткий ответ: используйте CloudBlob.FetchAttributes(), который делает запрос головы против большого двоичного объекта.
Кажется хромым, что вам нужно поймать исключение, чтобы проверить его, что blob существует.
public static bool Exists(this CloudBlob blob) { try { blob.FetchAttributes(); return true; } catch (StorageClientException e) { if (e.ErrorCode == StorageErrorCode.ResourceNotFound) { return false; } else { throw; } } }
Если blob является общедоступным, вы можете, конечно, просто отправить запрос HTTP HEAD-с любого из миллионов языков/сред/платформ, которые знают, как это сделать-и проверить ответ.
основные API Azure-это HTTP-интерфейсы RESTful на основе XML. Библиотека StorageClient является одной из многих возможных оболочек вокруг них. Вот еще одно, что сделал Шрирам Кришнан Питон:
http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html
Он также показывает, как аутентифицировать на уровне HTTP.
Я сделал аналогичную вещь для себя в C#, потому что я предпочитаю видеть Azure через объектив HTTP/REST, а не через объектив библиотеки StorageClient. Довольно долго я даже не удосужился реализовать метод ExistsBlob. Все мои капли были публичными, и это было тривиально HTTP HEAD.
новая библиотека хранения Windows Azure уже содержит метод Exist (). Это в Microsoft.На сайте windowsazure.Место хранения.файл DLL.
доступно в виде пакета NuGet
Создано: Microsoft
Id: WindowsAzure.Хранение
Версия: 2.0.5.1
Если вам не нравится с помощью метода исключения в C# версии, что judell предлагается ниже. Остерегайтесь, хотя, что вы действительно должны обрабатывать другие возможные ответы тоже.
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url); myReq.Method = "HEAD"; HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse(); if (myResp.StatusCode == HttpStatusCode.OK) { return true; } else { return false; }
с обновленным SDK, как только у вас есть CloudBlobReference вы можете вызвать Exists() на вашей ссылке.
вот как я это делаю. Показывая полный код для тех, кто в нем нуждается.
// Parse the connection string and return a reference to the storage account. CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("AzureBlobConnectionString")); CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); // Retrieve reference to a previously created container. CloudBlobContainer container = blobClient.GetContainerReference("ContainerName"); // Retrieve reference to a blob named "test.csv" CloudBlockBlob blockBlob = container.GetBlockBlobReference("test.csv"); if (blockBlob.Exists()) { //Do your logic here. }