Présentation des API REST de Windows Azure : Lister les comptes de storage

Tags: Azure, Rest

Maintenant que nous savons comment créer un certification de gestion et l’installer sur notre compte Windows Azure, nous allons l’utiliser pour lister les comptes de storage.

Comme nous le montre la documentation, il suffit d’envoyer une requête de type GET à une url bien précise :

https://management.core.windows.net/<subscription-id>/services/storageservices

Je vous rappelle que votre subscription-id se retrouve dans votre console d’administration Azure. C’est l’ID de votre abonnement :

azure7

Cette documentation nous montre que le résultat sera au format Xml qui listera les comptes avec leurs noms et leurs adresses. Nous allons donc créer une classe pour représenter ces données :

public class StorageService
{
    public string Url { get; set; }
    public string ServiceName { get; set; }
}

 

Puis une méthode qui effectuera l’appel :

public List<StorageService> StorageAccounts(string subscriptionId)
{
    var requestUrl = string.Format(
        "https://management.core.windows.net/{0}/services/storageservices",
        subscriptionId);


    WebResponse resp = null;
    try
    {
        // Code. cf plus bas dans l'article

    }
    catch (Exception ex)
    {
        Console.WriteLine("ERREUR : {0}", ex);
        throw;
    }
    finally
    {
        if (resp != null)
            resp.Close();
    }
}

 

Rien de bien compliqué pour l’instant.

Il faut donc constituer notre appel. Celui-ci contient un Header et un Body et un certificat. Dans notre cas, il n’y aura rien dans le Body, et dans le Header, il y aura juste le numéro de version de l’API REST (x-ms-version) :

var request = (HttpWebRequest) WebRequest.Create(requestUrl);
request.Method = "GET";
request.ContentType = "application/xml";
// le header
var requestHeaders = new NameValueCollection {{"x-ms-version", "2009-10-01"}};
request.Headers.Add(requestHeaders);
// le certificat
request.ClientCertificates.Add(GetCertificate());

 

On est prêt à envoyer la sauce :

// envoi de la requête
resp = request.GetResponse();
var httpResp = (HttpWebResponse) resp;
// lecture du contenu (format Xml)
string content;
using (var reader = new StreamReader(httpResp.GetResponseStream()))
{
    content = reader.ReadToEnd();
}

 

Dans content, on a donc le contenu au format Xml (si tout s’est bien passé, of course). La méthode ReadStorageAccountResponse va donc analyser ce contenu :

private List<StorageService> ReadStorageAccountResponse(string content)
{
    var document = XDocument.Parse(content);
    XNamespace ns = "http://schemas.microsoft.com/windowsazure";

    return document.Element(ns + "StorageServices")
        .Elements(ns + "StorageService")
        .Select(root => new StorageService
                            {
                                Url = root.Element(ns + "Url").Value,
                                ServiceName = root.Element(ns + "ServiceName").Value
                            }).ToList();
}

 

Et voila, vous pouvez maintenant lister facilement vos comptes de storage :

private const string CertificateThumbprint = "[VOTRE EMPREINTE DE CERTIFICAT]";

public List<StorageService> StorageAccounts(string subscriptionId)
{
    var requestUrl = string.Format(
        "https://management.core.windows.net/{0}/services/storageservices",
        subscriptionId);

    WebResponse resp = null;
    try
    {
        var request = (HttpWebRequest) WebRequest.Create(requestUrl);
        request.Method = "GET";
        request.ContentType = "application/xml";
        // le header
        var requestHeaders = new NameValueCollection {{"x-ms-version", "2009-10-01"}};
        request.Headers.Add(requestHeaders);
        // le certificat
        request.ClientCertificates.Add(GetCertificate());

        // envoi de la requête
        resp = request.GetResponse();
        var httpResp = (HttpWebResponse) resp;
        // lecture du contenu (format Xml)
        string content;
        using (var reader = new StreamReader(httpResp.GetResponseStream()))
        {
            content = reader.ReadToEnd();
        }
        return ReadStorageAccountResponse(content);

    }
    catch (Exception ex)
    {
        Console.WriteLine("ERREUR : {0}", ex);
        throw;
    }
    finally
    {
        if (resp != null)
            resp.Close();
    }
}

private List<StorageService> ReadStorageAccountResponse(string content)
{
    var document = XDocument.Parse(content);
    XNamespace ns = "http://schemas.microsoft.com/windowsazure";

    return document.Element(ns + "StorageServices")
        .Elements(ns + "StorageService")
        .Select(root => new StorageService
                            {
                                Url = root.Element(ns + "Url").Value,
                                ServiceName = root.Element(ns + "ServiceName").Value
                            }).ToList();
}     

private static X509Certificate2 GetCertificate()
{
    var certificateStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    try
    {
        certificateStore.Open(OpenFlags.ReadOnly);
        var certs = certificateStore.Certificates.Find(
            X509FindType.FindByThumbprint,
            CertificateThumbprint,
            false);

        if (certs.Count != 1)
        {
            Console.WriteLine("Certificat introuvable (CurrentUser)");
            throw new InvalidOperationException("Certificat introuvable");
        }
        return certs[0];
    }
    finally
    {
        certificateStore.Close();
    }
}
blog comments powered by Disqus