Проверка наличия большого двоичного объекта в хранилище Azure


У меня очень простой вопрос (я надеюсь!)- Я просто хочу узнать, существует ли blob (с именем, которое я определил) в определенном контейнере. Я буду загружать его, если он существует, а если нет, то я сделаю что-то еще.

Я сделал некоторый поиск по интертрубам и, по-видимому, раньше была функция под названием DoesExist или что-то подобное... но, как и во многих API Azure, это больше не кажется там (или если это так, имеет очень умно замаскированный имя.)

8 100

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

см. также msdn

Если вам не нравится с помощью метода исключения в 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() на вашей ссылке.

см http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.blob.cloudblockblob.exists.aspx

вот как я это делаю. Показывая полный код для тех, кто в нем нуждается.

        // 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.
        }