Frage

Gibt es irgendwo in der Service-Laufzeit, die mir sagen würde, wenn ich zur Zeit auf ‚Staging‘ renne oder ‚Herstellung‘? Manuell zu modifizieren scheint die Config zu und von der Produktion ein wenig umständlich.

War es hilfreich?

Lösung

Sie sollten wirklich nicht Ihre Konfigurationen ändern, wenn Sie auf Basis sind, wenn Sie in Prod oder Staging sind. Staging-Bereich ausgelegt ist, nicht eine „QA“ Umgebung zu sein, sondern nur einen Haltebereich vor der Produktion eingesetzt wird.

Wenn Sie einen neuen Einsatz laden, aktuelle Bereitstellung Steckplatz, in dem Sie Ihr Paket laden zu zerstört und sind für 10-15 Minuten, während Upload nach unten und Start der VM geschieht. Wenn Sie gerade in der Produktion laden, das ist 15 Minuten von Produktionsausfällen. So Staging Bereich erfunden wurde: Sie Inszenierung laden, das Zeug testen, und klicken Sie auf „Swap“ und Ihre Staging-Umgebung wird auf magische Weise Production (virtuelle IP-Swap). So wirklich Staging 100% die gleichen wie Ihre Produktion sein sollte.

Was ich denke, Sie suchen QA / Umgebung testen? Sie sollten einen neuen Service für Testumgebung mit einer eigenen Prod / Inszenierung eröffnen. In diesem Fall sollten Sie mehrere Konfigurationsdatei-Sets, ein Set pro Bereitstellungsumgebung (Herstellung, Prüfung, etc.)

halten

Es gibt viele Möglichkeiten, konfigurations Hölle zu verwalten, die, vor allem mit Azure auftritt, die auf der Oberseite der CONFIG-Dateien hat, seine eigene * .cscfg Dateien. Die Art, wie ich es lieber mit Azure-Projekt zu tun ist, wie folgt: Richten Sie ein kleines Config Projekt, Ordner erstellen gibt, die Match-Bereitstellungstypen. Innerhalb jeden Ordner Setup-Sätze * .config & * .cscfg Dateien, die Anpassung an bestimmten Implementierungsumgebung: Debug, Test, Freigabe ... das ist Setup in Visual Studio als auch als Build-Zieltypen. Ich habe einen kleinen xcopy-Befehl, der bei jeder Kompilierung des Config-Projektes auftritt, kopiert alle Dateien aus Build-Ziel-Ordnern Config Projekt in Stammverzeichnis des Config-Projektes.

Dann jedes anderes Projekt in der Lösung, Links auf die .config oder .cscfg Datei aus dem Stammverzeichnis des Config-Projektes.

Voila, meine configs anpassen magisch an jede Build-Konfiguration automatisch. Ich auch Transformationen verwenden .config zu verwalten Debug-Informationen zu Release vs. Nicht-Veröffentlichung Build-Ziele.

Wenn Sie gelesen haben alle diese und wollen noch in dem Produktion vs. Staging-Status erhalten während der Laufzeit , dann gilt: Holen deploymentId von RoleEnvironment.DeploymentId verwenden Management API mit einer richtigen X509 certificate dann am Azure structure of your Service zu erhalten und die GetDeployments Methode aufrufen (es Ruhe api, aber es ist eine Abstraktion, Bibliothek).

Hope, das hilft

Edit: Blog-Post, wie etwa die Einrichtung von Konfigurationsstrings angefordert und das Umschalten zwischen Umgebungen @ http://blog.paraleap.com/blog/post/Managing-environments-in-a-distributed-Azure-or-other- Cloud-basierte-NET-Lösung

Andere Tipps

Manchmal wünsche ich Leute würden nur die Frage beantworten .. nicht erklären, Ethik oder Best Practices ...

hat Microsoft ein Codebeispiel geschrieben tut genau dies hier: https: //code.msdn .microsoft.com / windowsazure / CSAzureDeploymentSlot-1ce0e3b5

Bild zeigt Staging-Instanz

Bild zeigt Produktion Instanz

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(); 
    } 
}

Staging ist ein temporärer Einsatz Slot verwendet hauptsächlich für nicht-Ausfallzeiten Upgrades und Fähigkeit zur Zurückdrängung ein Upgrade.

Es wird empfohlen, nicht zu koppeln Ihr System (entweder im Code oder in config) mit einem solchen Azure Besonderheiten.

Da Windows Azure Management-Bibliotheken und dank @ GuaravMantri Antwort auf eine andere Frage, die Sie es wie folgt tun:

using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using Microsoft.Azure;
using Microsoft.WindowsAzure.Management.Compute;
using Microsoft.WindowsAzure.Management.Compute.Models;

namespace Configuration
{
    public class DeploymentSlotTypeHelper
    {
        static string subscriptionId = "<subscription-id>";
        static string managementCertContents = "<Base64 Encoded Management Certificate String from Publish Setting File>";// copy-paste it
        static string cloudServiceName = "<your cloud service name>"; // lowercase
        static string ns = "http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration";

        public DeploymentSlot GetSlotType()
        {
            var managementCertificate = new X509Certificate2(Convert.FromBase64String(managementCertContents));
            var credentials = new CertificateCloudCredentials(subscriptionId, managementCertificate);

            var computeManagementClient = new ComputeManagementClient(credentials);
            var response = computeManagementClient.HostedServices.GetDetailed(cloudServiceName);
            return response.Deployments.FirstOrDefault(d => d.DeploymentSlot == DeploymentSlot.Production) == null ? DeploymentSlot.Staging : DeploymentSlot.Production;
        }
    }
}

Eine einfache Möglichkeit, dieses Problem zu lösen setzt auf Ihren Instanzen einen Schlüssel zu identifizieren, welche Umgebung es ausgeführt wird.

1) in Ihrer Produktion Schlitz Set: Legen Sie es Einstellungen >> Anwendungseinstellungen >> App-Einstellungen Und erstellen Sie einen Schlüssel mit dem Namen SLOT_NAME und Wert „Produktion“. WICHTIG: Check Slot-Einstellung.

2) in der Staging-Slot Set: Legen Sie es Einstellungen >> Anwendungseinstellungen >> App-Einstellungen Und erstellen Sie einen Schlüssel mit dem Namen SLOT_NAME und Wert „staging“. WICHTIG: Check Slot-Einstellung.

Der Zugang von Ihrer Anwendung der Variable und identifizieren, welche Umgebung der Anwendung ausgeführt wird. In Java können Sie zugreifen:

String slotName = System.getenv("APPSETTING_SLOT_NAME");

Hier gibt es 4 Punkte beachten

  1. VIP-Swap macht nur Sinn, wenn der Dienst die Außenwelt gerichtet ist. AKA, wenn es stellt eine API und reagiert auf Anfragen.
  2. Wenn es um Service und tut Pull Nachrichten aus einer Warteschlange ist und verarbeiten sie, dann Ihre Dienste ist proaktiv und VIP-Swap ist keine gute Lösung für Sie.
  3. Wenn Ihr Dienst sowohl reaktive als auch proaktive ist, sollten Sie Ihr Design zu überdenken. Vielleicht teilen den Service in 2 verschiedenen Dienste.
  4. Erics Vorschlag, die cscfg Dateien modifizieren Pre- und Post-VIP-Swap ist gut, wenn der proaktive Teil Ihres Service eine kurze Ausfallzeit in Anspruch nehmen (Weil Sie zunächst sowohl Staging und Produktion konfigurieren, dass keine Nachrichten ziehen, dann VIP Swap durchführen und dann Produktion Konfiguration aktualisieren Nachrichten zu starten ziehen).
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top