Проверка наличия капли в Azure Storage

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

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

Ответ 1

Новый API имеет вызов функции .Exists(). Просто убедитесь, что вы используете GetBlockBlobReference, который не выполняет вызов на сервер. Это облегчает выполнение функции:

public static bool BlobExistsOnCloud(CloudBlobClient client, 
    string containerName, string key)
{
     return client.GetContainerReference(containerName)
                  .GetBlockBlobReference(key)
                  .Exists();  
}

Ответ 2

Примечание. Этот ответ устарел сейчас. Пожалуйста, обратитесь к Ричарду за простой способ проверить наличие

Нет, вам не хватает чего-то простого... мы неплохо скрыли этот метод в новой библиотеке StorageClient.:)

Я только что написал сообщение в блоге, чтобы ответить на ваш вопрос: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob.

Короткий ответ: используйте CloudBlob.FetchAttributes(), который выполняет запрос HEAD против blob.

Ответ 3

Похоже, что вам нужно поймать исключение, чтобы проверить, существует ли 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;
        }
    }
}

Ответ 4

Если blob является общедоступным, вы можете, конечно, просто отправить запрос HTTP HEAD - из любого из уровней языков/сред/платформ, которые знают, как это сделать, и проверить ответ.

Основными API-интерфейсами Azure являются HTTP-интерфейсы RESTful на основе XML. Библиотека StorageClient является одной из многих возможных оболочек вокруг них. Здесь другой, который Шрирам Кришнан сделал в Python:

http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html

Он также показывает, как аутентифицироваться на уровне HTTP.

Я сделал аналогичную вещь для себя в С#, потому что я предпочитаю видеть Azure через объектив HTTP/REST, а не через объектив библиотеки StorageClient. Некоторое время я даже не потрудился внедрить метод ExistsBlob. Все мои капли были общедоступными, и было тривиально делать HTTP HEAD.

Ответ 5

Новая библиотека хранения Windows Azure уже содержит метод Exist(). Это находится в Microsoft.WindowsAzure.Storage.dll.

Доступно как пакет NuGet
Создано: Microsoft
Id: WindowsAzure.Storage
Версия: 2.0.5.1

См. Также msdn

Ответ 6

Если вам не нравится использовать метод исключения, то базовая версия С# того, что предлагает 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;
}

Ответ 8

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

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