There are times when it is important for Azure Cloud Service application to know which deployment slot it is operating in.  Worker Roles in particular need to know if certain functionality should be disabled when running in the Staging slot. This article will provide a step by step way to find that either you are in Staging or Production environment when testing out your application.

This is adapted from a code sample from MSDN Samples library. In short you need to get deploymentId from RoleEnvironment.DeploymentId Then use Management API with a proper X509 certificate to get at the Azure structure of your Service and call the GetDeployments method (it's rest api but there is an abstraction library).  

Now to use the code from Micrsoft, you must have installed Windows Azure SDK 1.6

 

Step 1 –  Open the CSAzureDeploymentSlot.sln file with Visual Studio in elevated (administrator) mode

Step 2-  Set CSAzureDeploymentSlot Azure application as the startup application.

Step 3-  Replace the following variables with your Azure application's information.

C#

string subscriptionID = "<Your subscription ID>"; 

string thrumbnail = "<Your certificate thumbnail print>"; 

string hostedServiceName = "<Your hosted service name>"; 

 

 

Step 4-  Upload a server certificate in Azure Management Portal, also add the same thumbnail print client certificate in Web role. Right Click your role => select "Certificates" => "Add Certificate".

Step 5- This sample code cannot execute on the local, because local deploymentID is different with cloud deploymentID, local's ID like "Deployment(XXX)", but cloud'ID is a GUID. So if you run the application in local, its display "Do not find this id".

Step 6- . After deploying the application, click the DNS name of the role, if your application is in Staging slot, it will display:

Check Staging

 If your application is in Production slot, it will display:

Check Production

Additionally,

  • Create a Cloud Application Project in Visual Studio 2010, name it as "CSAzureDeploymentSlot", please also create a Web Role application and name it as "CSAzureDeploymentSlot_WebRole".
  • Delete all unnecessary files of the Web role application, and create a new Default web form page. Add a button control on this page, this page is used to send GET request to Azure management api to get deployment slot from Azure application. Please add the following code snippets in Default.aspx.cs file.

Here is the actual code that determines Windows Azure application's current instance deployment slot:

C#

protected void Page_Load(object sender, EventArgs e) 

    // You basic information of the Deployment of Azure application. 

    string deploymentId = RoleEnvironment.DeploymentId; 

    string subscriptionID = "<Your subscription ID>"; 

    string thrumbnail = "<Your certificate thumbnail print>"; 

    string hostedServiceName = "<Your hosted service name>"; 

    string productionString = string.Format("https://management.core.windows.net/{0}/services/hostedservices/{1}/deploymentslots/{2}", 

subscriptionID, hostedServiceName, "Production"); 

    Uri requestUri = new Uri(productionString); 

 

 

    // Add client certificate. 

    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 

    store.Open(OpenFlags.OpenExistingOnly); 

    X509Certificate2Collection collection = store.Certificates.Find(X509FindType.FindByThumbprint, thrumbnail, false); 

    store.Close(); 

 

 

    if (collection.Count != 0) 

    { 

        X509Certificate2 certificate = collection[0]; 

        HttpWebRequest httpRequest = (HttpWebRequest)HttpWebRequest.Create(requestUri); 

        httpRequest.ClientCertificates.Add(certificate); 

        httpRequest.Headers.Add("x-ms-version", "2011-10-01"); 

        httpRequest.KeepAlive = false

        HttpWebResponse httpResponse = httpRequest.GetResponse() as HttpWebResponse; 

 

 

        // Get response stream from Management API. 

        Stream stream = httpResponse.GetResponseStream(); 

        string result = string.Empty; 

        using (StreamReader reader = new StreamReader(stream)) 

        { 

            result = reader.ReadToEnd(); 

 

 

        } 

        if (result == null || result.Trim() == string.Empty) 

            return

        XDocument document = XDocument.Parse(result); 

        string serverID = string.Empty; 

        var list = from item in document.Descendants(XName.Get("PrivateID", "http://schemas.microsoft.com/windowsazure")) 

                   select item; 

         

        serverID = list.First().Value; 

        Response.Write("Check Production: "); 

        Response.Write("DeploymentID : " + deploymentId + " ServerID :" + serverID); 

        if (deploymentId.Equals(serverID)) 

            lbStatus.Text = "Production"; 

        else 

        { 

            // If the application not in Production slot, try to check Staging slot. 

            string stagingString = string.Format("https://management.core.windows.net/{0}/services/hostedservices/{1}

/deploymentslots/{2}", subscriptionID, hostedServiceName, "Staging"); 

            Uri stagingUri = new Uri(stagingString); 

            httpRequest = (HttpWebRequest)HttpWebRequest.Create(stagingUri); 

            httpRequest.ClientCertificates.Add(certificate); 

            httpRequest.Headers.Add("x-ms-version", "2011-10-01"); 

            httpRequest.KeepAlive = false

            httpResponse = httpRequest.GetResponse() as HttpWebResponse; 

            stream = httpResponse.GetResponseStream(); 

            result = string.Empty; 

            using (StreamReader reader = new StreamReader(stream)) 

            { 

                result = reader.ReadToEnd(); 

 

 

            } 

            if (result == null || result.Trim() == string.Empty) 

                return

            document = XDocument.Parse(result); 

            serverID = string.Empty; 

            list = from item in document.Descendants(XName.Get("PrivateID", "http://schemas.microsoft.com/windowsazure")) 

                       select item; 

 

 

            serverID = list.First().Value; 

            Response.Write(" Check Staging:"); 

            Response.Write(" DeploymentID : " + deploymentId + " ServerID :" + serverID); 

            if (deploymentId.Equals(serverID)) 

                lbStatus.Text = "Staging"; 

            else 

                lbStatus.Text = "Do not find this id"; 

        } 

        httpResponse.Close(); 

        stream.Close(); 

    }