Click here to Skip to main content
15,896,201 members
Please Sign up or sign in to vote.
4.00/5 (1 vote)
Hi All,
We are trying to access the Create Deployment method stated below
http://msdn.microsoft.com/en-us/library/windowsazure/ee460813
We have uploaded the Package in the blob and browsing the configuration file. We have checked trying to upload manually the package and config file in Azure portal and its working fine.
Below is the code we have written for creating deployment where "AzureEcoystemCloudService" is our cloud service name where we want to deploy our package. I have also highlighted the XML creation part.

C#
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/shubhendustorage/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 &gt; 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
XML
 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>


Thanks,
Shubhendu
Posted
Updated 24-Jul-12 0:57am
v2
Comments
enhzflep 24-Jul-12 7:01am    
C'mon mate - 6 1/2 years here and you're making a post without pre tags?
Also, you forgot to html encode it - all of your summary info was missing.
Paste, html encode ('encode' btn), add code tags (code btn, select relevant lang from drop-down)

1 solution

In my case issue was issue was with Byte Order Mark. When I read configuration file from StorageAccount as shown bellow, and tried to create new deploy, azure returned me the same error as your.
C#
using (var stream = new MemoryStream())
{
    blobReference.DownloadToStream(stream);
    var configurationBytes = stream.ToArray();
    configuration = System.Text.Encoding.UTF8.GetString(configurationBytes);
}


To avoid issue with BOM I changed the code to this one.

C#
using (var stream = new MemoryStream())
{
    blobReference.DownloadToStream(stream);
    stream.Position = 0;

    using (var streamReader = new StreamReader(stream))
    {
        configuration = streamReader.ReadToEnd();
    }
}


StreamReader can by it self detect encoding of file and return text in correct way.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900