porta - Comprobando si existe un blob en Azure Storage
porta azure (8)
Tengo una pregunta muy simple (¡espero!) - Solo quiero saber si existe un blob (con un nombre que he definido) en un contenedor en particular. Lo descargaré si existe, y si no lo hace, haré algo más.
He hecho algunas búsquedas en los intertubos y aparentemente solía haber una función llamada DoesExist o algo similar ... pero como con muchas de las API de Azure, esto ya no parece estar allí (o si lo es, tiene una nombre muy ingeniosamente disfrazado).
Con el SDK actualizado, una vez que tenga CloudBlobReference, puede llamar a Exists () en su referencia.
Esta es la forma en que lo hago. Mostrando el código completo para aquellos que lo necesitan.
// 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.
}
La nueva Biblioteca de almacenamiento de Windows Azure ya contiene el método Exist (). Está en Microsoft.WindowsAzure.Storage.dll.
Disponible como paquete NuGet
Creado por: Microsoft
Id: WindowsAzure.Storage
Versión: 2.0.5.1
Parece cojo que necesita atrapar una excepción para probar que el blob existe.
public static bool Exists(this CloudBlob blob)
{
try
{
blob.FetchAttributes();
return true;
}
catch (StorageClientException e)
{
if (e.ErrorCode == StorageErrorCode.ResourceNotFound)
{
return false;
}
else
{
throw;
}
}
}
Si el blob es público, puede, por supuesto, enviar una solicitud HTTP HEAD (desde cualquiera de los trillones de idiomas / entornos / plataformas que saben cómo hacerlo) y verificar la respuesta.
Las API centrales de Azure son interfaces HTTP RESTful basadas en XML. La biblioteca StorageClient es una de las muchas envolturas posibles a su alrededor. Aquí hay otro que Sriram Krishnan hizo en Python:
http://www.sriramkrishnan.com/blog/2008/11/python-wrapper-for-windows-azure.html
También muestra cómo autenticarse en el nivel HTTP.
He hecho algo similar para mí en C #, porque prefiero ver Azure a través de la lente de HTTP / REST en lugar de a través de la lente de la biblioteca de StorageClient. Durante bastante tiempo ni siquiera me había molestado en implementar un método ExistsBlob. Todos mis blobs eran públicos, y era trivial hacer HTTP HEAD.
Si no le gusta usar el método de excepción, entonces la versión básica de c # de lo que sugiere Judell es la siguiente. Sin embargo, ten cuidado de que realmente deberías manejar otras respuestas posibles.
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
myReq.Method = "HEAD";
HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse();
if (myResp.StatusCode == HttpStatusCode.OK)
{
return true;
}
else
{
return false;
}
Nota: Esta respuesta está desactualizada ahora. Por favor, vea la respuesta de Richard para una manera fácil de verificar la existencia
No, no te estás perdiendo algo simple ... hicimos un buen trabajo al ocultar este método en la nueva biblioteca de StorageClient. :)
Acabo de escribir una publicación de blog para responder a su pregunta: http://blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob .
La respuesta corta es: use CloudBlob.FetchAttributes (), que hace una solicitud HEAD contra el blob.
La nueva API tiene la llamada de función .Exists (). Solo asegúrese de usar GetBlockBlobReference
, que no realiza la llamada al servidor. Hace la función tan fácil como:
public static bool BlobExistsOnCloud(CloudBlobClient client,
string containerName, string key)
{
return client.GetContainerReference(containerName)
.GetBlockBlobReference(key)
.Exists();
}