2012-02-28 94 views
0

我是一名学生,我尝试创建一个应用程序,允许用户更改Azure上托管服务的实例数。这是我上传一个新的服务配置文件 (http://msdn.microsoft.com/en-us/library/windowsazure/ee460809.aspx)。我的问题是,当我尝试在下面的代码中得到响应时,我一直在收到错误“远程服务器返回错误:(403)禁止”。我认为错误必须与证书有关,但我可以执行GET请求成功并使用我在此使用的相同证书获得正确的响应。任何帮助非常赞赏.config是新的配置文件。Azure服务管理api更改配置

公共无效changeConfiguration(字符串服务名,串deploymentSlot,串配置,串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; 
     } 

回答

0

它看起来像你的内容类型不正确。这是API调用的要求之一。

您有:

request.ContentType = "text/xml"; 

你应该有:

request.ContentType = "application/xml"; 

此外,有没有你设置你的X-MS-版本为 “2010-10-28”,而不是一个理由最新的API是“2011-08-01”;

参考:http://msdn.microsoft.com/en-us/library/windowsazure/ee460809.aspx

编辑:我也有点担心你是如何将自己的身体数据。它看起来像你将文本转换为UTF8字节数组,然后对字节数组进行tostring并将其重新编码为ASCII字节数组。这对我来说很奇怪。你应该能够直接将你的字符串传递给StreamWriter的Write(bodyText)方法。 API可能不知道如何解码您要发送的正文数据。

尝试这样的事情...

request.ContentType = "application/xml"; 

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