2012-02-28 2 views
0

Je suis un étudiant et j'essaie de créer une application qui permet à un utilisateur de modifier le nombre d'instances de son service hébergé sur Azure. Ceci est fait mon téléchargement d'un nouveau fichier de configuration pour le service (http://msdn.microsoft.com/en-us/library/windowsazure/ee460809.aspx). Mon problème est que je continue à obtenir l'erreur "Le serveur distant a renvoyé une erreur: (403) Interdit" quand j'essaye d'obtenir une réponse dans le code ci-dessous. J'ai supposé que l'erreur devait être quelque chose à faire avec des certificats mais je peux effectuer Obtenez les demandes avec succès et obtenez la réponse correcte en utilisant le même certificat que j'utilise ici. Toute aide est grandement appréciée.config est le nouveau fichier de configuration.Configuration de la configuration de l'API de gestion des services Azure

changeConfiguration public void (string serviceName, chaîne deploymentSlot, config string, string deploymentName)

{ 

     byte[] encodedConfigbyte = new byte[config.Length]; 
     encodedConfigbyte = System.Text.Encoding.UTF8.GetBytes(config); 
     string encodedConfig = Convert.ToBase64String(encodedConfigbyte); 

     Uri changeConfigRequestUri = new Uri("https://management.core.windows.net/" + subscriptionId + "/services/hostedservices/" + serviceName + "/deployments/" + deploymentName + "/?comp=config)"); 

     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(changeConfigRequestUri); 

     request.Headers.Add("x-ms-version", "2010-10-28"); 
     request.Method = "POST"; 

     string bodyText = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
          "<ChangeConfiguration xmlns=\"http://schemas.microsoft.com/windowsazure" + ">" + "<Configuration>" + encodedConfig + "</Configuration>" + "<TreatWarningsAsError>false</TreatWarningsAsError>" + "<Mode>Auto</Mode>"+"</ChangeConfiguration>"; 

     byte[] buf = Encoding.UTF8.GetBytes(bodyText); 
     request.ContentType = "text/xml"; 
     request.ContentLength = buf.Length; 

     StreamWriter writer = new StreamWriter(request.GetRequestStream()); 
     var data = Encoding.ASCII.GetBytes(buf.ToString()); 
     writer.Write(data); 
     writer.Flush(); 
     writer.Close(); 

     X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
     try 
     { 
      certStore.Open(OpenFlags.ReadOnly); 
     } 
     catch (Exception e) 
     { 
      if (e is CryptographicException) 
      { 
       Console.WriteLine("Error: The store is unreadable."); 
      } 
      else if (e is SecurityException) 
      { 
       Console.WriteLine("Error: You don't have the required permission."); 
      } 
      else if (e is ArgumentException) 
      { 
       Console.WriteLine("Error: Invalid values in the store."); 
      } 
      else 
      { 
       throw; 
      } 
     } 


     X509Certificate2Collection certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false); 
     certStore.Close(); 

     if (certCollection.Count == 0) 
     { 
      throw new Exception("Error: No certificate found containing thumbprint " + thumbprint); 
     } 

     X509Certificate2 certificate = certCollection[0]; 
     request.ClientCertificates.Add(certificate); 


     //Error occurs in line below 
     WebResponse response = (HttpWebResponse)request.GetResponse(); 
     try 
     { 
      response = request.GetResponse(); 
     } 
     catch (WebException e) 
     { 
      string test = e.Message; 
     } 

Répondre

0

Il ressemble à votre type de contenu est incorrect. C'est l'une des conditions requises pour l'appel d'API.

Vous avez:

request.ContentType = "text/xml"; 

Vous devriez avoir:

request.ContentType = "application/xml"; 

Aussi, est-il une raison que vous configurez votre x-ms version à "2010-10-28" au lieu de la dernière API qui est "2011-08-01";

Référence: http://msdn.microsoft.com/en-us/library/windowsazure/ee460809.aspx

EDIT: Je suis aussi un peu inquiet de la façon dont vous ajoutez vos données de corps. Il semblerait que vous convertissiez votre texte en un tableau d'octets UTF8, puis que vous fassiez un tostring sur le tableau d'octets et que vous le réencodiez en un tableau d'octets ascii. C'est étrange pour moi. Vous devriez pouvoir passer votre chaîne directement dans la méthode Write (bodyText) de StreamWriter. L'API peut ne pas savoir comment décoder les données de corps que vous envoyez.

Essayez quelque chose comme ça ...

request.ContentType = "application/xml"; 

    using (var writer = new StreamWriter(request.GetRequestStream())) 
    { 
     writer.Write(bodyText); 
    } 
Questions connexes