2012-07-24 42 views
0

我們正在嘗試訪問下面所述的創建部署方法 http://msdn.microsoft.com/en-us/library/windowsazure/ee460813 我們已將Package上載到Blob中並瀏覽配置文件。我們檢查了試圖手動上傳Azure門戶中的軟件包和配置文件,它的工作正常。 以下是我們爲創建部署而編寫的代碼,其中「AzureEcoystemCloudService」是我們想要部署我們的軟件包的雲服務名稱。REST API:創建部署拋出錯誤BadRequest

byte[] bytes = new byte[fupldConfig.PostedFile.ContentLength + 1]; 
     fupldConfig.PostedFile.InputStream.Read(bytes, 0, bytes.Length); 
     string a = Encoding.UTF8.GetString(bytes, 0, bytes.Length); 
     string base64ConfigurationFile = a.ToBase64(); 
     X509Certificate2 certificate = CertificateUtility.GetStoreCertificate 
     (ConfigurationManager.AppSettings["thumbprint"].ToString()); 


     HostedService.CreateNewDeployment(certificate, ConfigurationManager.AppSettings 
     ["SubscriptionId"].ToString(), "2012-03-01", "AzureEcoystemCloudService", 
     Infosys.AzureEcosystem.Entities.Enums.DeploymentSlot.staging, 
     "AzureEcoystemDeployment", "http://shubhendustorage.blob.core.windows.net/shubhendu 
     storage/Infosys.AzureEcoystem.Web.cspkg", "AzureEcoystemDeployment", 
     base64ConfigurationFile, true, false); 



    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="certificate"></param> 
    /// <param name="subscriptionId"></param> 
    /// <param name="version"></param> 
    /// <param name="serviceName"></param> 
    /// <param name="deploymentSlot"></param> 
    /// <param name="name"></param> 
    /// <param name="packageUrl"></param> 
    /// <param name="label"></param> 
    /// <param name="base64Configuration"></param> 
    /// <param name="startDeployment"></param> 
    /// <param name="treatWarningsAsError"></param> 
    public static void CreateNewDeployment(X509Certificate2 certificate, string 
    subscriptionId,string version, string serviceName, 
    Infosys.AzureEcosystem.Entities.Enums.DeploymentSlot deploymentSlot, string name, 
    string packageUrl, string label, string base64Configuration, 
     bool startDeployment, bool treatWarningsAsError) 
    { 
     Uri uri = new Uri(String.Format(Constants.CreateDeploymentUrlTemplate, 
     subscriptionId, serviceName, deploymentSlot.ToString())); 
     XNamespace wa = Constants.xmlNamespace; 
     XDocument requestBody = new XDocument(); 

     String base64ConfigurationFile = base64Configuration; 
     String base64Label = label.ToBase64(); 
     XElement xName = new XElement(wa + "Name", name); 
     XElement xPackageUrl = new XElement(wa + "PackageUrl", packageUrl); 
     XElement xLabel = new XElement(wa + "Label", base64Label); 
     XElement xConfiguration = new XElement(wa + "Configuration", 
     base64ConfigurationFile); 
     XElement xStartDeployment = new XElement(wa + "StartDeployment", 
     startDeployment.ToString().ToLower()); 
     XElement xTreatWarningsAsError = new XElement(wa + "TreatWarningsAsError", 
     treatWarningsAsError.ToString().ToLower()); 
     XElement createDeployment = new XElement(wa + "CreateDeployment"); 

     createDeployment.Add(xName); 
     createDeployment.Add(xPackageUrl); 
     createDeployment.Add(xLabel); 
     createDeployment.Add(xConfiguration); 
     createDeployment.Add(xStartDeployment); 
     createDeployment.Add(xTreatWarningsAsError); 
     requestBody.Add(createDeployment); 
     requestBody.Declaration = new XDeclaration("1.0", "UTF-8", "no"); 
     XDocument responseBody; 
     RestApiUtility.InvokeRequest(
      uri, Infosys.AzureEcosystem.Entities.Enums.RequestMethod.POST.ToString(), 
     HttpStatusCode.Accepted, requestBody, certificate, version, out responseBody); 
    } 
    /// <summary> 
    /// A helper function to invoke a Service Management REST API operation. 
    /// Throws an ApplicationException on unexpected status code results. 
    /// </summary> 
    /// <param name="uri">The URI of the operation to invoke using a web request.</param> 
    /// <param name="method">The method of the web request, GET, PUT, POST, or 
    DELETE.</param> 
    /// <param name="expectedCode">The expected status code.</param> 
    /// <param name="requestBody">The XML body to send with the web request. Use null to 
    send no request body.</param> 
    /// <param name="responseBody">The XML body returned by the request, if any.</param> 
    /// <returns>The requestId returned by the operation.</returns> 
    public static string InvokeRequest(
     Uri uri, 
     string method, 
     HttpStatusCode expectedCode, 
     XDocument requestBody, 
     X509Certificate2 certificate, 
     string version, 
     out XDocument responseBody) 
    { 
     responseBody = null; 
     string requestId = String.Empty; 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
     request.Method = method; 
     request.Headers.Add("x-ms-Version", version); 
     request.ClientCertificates.Add(certificate); 
     request.ContentType = "application/xml"; 
     if (requestBody != null) 
     { 
      using (Stream requestStream = request.GetRequestStream()) 
      { 
       using (StreamWriter streamWriter = new StreamWriter(
        requestStream, System.Text.UTF8Encoding.UTF8)) 
       { 
        requestBody.Save(streamWriter, SaveOptions.DisableFormatting); 
       } 
      } 
     } 
     HttpWebResponse response; 
     HttpStatusCode statusCode = HttpStatusCode.Unused; 
     try 
     { 
      response = (HttpWebResponse)request.GetResponse(); 
     } 
     catch (WebException ex) 
     { 
      // GetResponse throws a WebException for 4XX and 5XX status codes 
      response = (HttpWebResponse)ex.Response; 
     } 
     try 
     { 
      statusCode = response.StatusCode; 
      if (response.ContentLength > 0) 
      { 
       using (XmlReader reader = XmlReader.Create(response.GetResponseStream())) 
       { 
        responseBody = XDocument.Load(reader); 
       } 
      } 
      if (response.Headers != null) 
      { 
       requestId = response.Headers["x-ms-request-id"]; 
      } 
     } 
     finally 
     { 
      response.Close(); 
     } 
     if (!statusCode.Equals(expectedCode)) 
     { 
      throw new ApplicationException(string.Format(
       "Call to {0} returned an error:{1}Status Code: {2} ({3}):{1}{4}", 
       uri.ToString(), 
       Environment.NewLine, 
       (int)statusCode, 
       statusCode, 
       responseBody.ToString(SaveOptions.OmitDuplicateNamespaces))); 
     } 
     return requestId; 
    } 




    But every time we are getting the below error from the line 

    response = (HttpWebResponse)request.GetResponse(); 

    <Error xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <Code>BadRequest</Code> 
     <Message>The specified configuration settings for Settings are invalid. Verify that the service configuration file is a valid XML file, and that role instance counts are specified as positive integers.</Message> 

</Error> 

感謝, Shubhendu

+0

參見http://social.msdn.microsoft.com/Forums/en-US/windowsazuredevelopment/thread/08ea3289-0f10-4bc5-8f39-6124a1afd22c/ – smarx 2012-07-24 17:44:46

回答

4

我已經與湛藍的休息API請求的問題。我發現閱讀WebException的響應是無價的。

try 
{ 
    //Call Azure REST API 
} 
catch(WebException ex) 
{ 
    var err = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); 

    Console.WriteLine(err); 

    throw; 
} 

這應該爲您提供有關請求潛在問題的足夠信息。

0

從Azure SDK 2.2開始,它最終的文檔是錯誤的,您不需要base64編碼配置字符串。因此,不要將所有byte []轉換爲base64,只需傳入一個UFT8字符串。

相關問題