2012-07-18 10 views
5

Ich sehe nicht, wie Sie mit Windows Azure die Konfiguration einer Anwendung ändern können, wenn Sie keine andere Wahl haben, als die Konfigurationseinstellungen in web.config (oder app.config) zu speichern.Azure-Rollenkonfigurationsverwaltung

Zum Beispiel ...

Oft Projekte Verwendung einer 3rd-Party-Bibliothek machen, die starke Nutzung von web.config macht. Die Verwendung von web.config kann Verbindungszeichenfolgen, App-Einstellungen oder benutzerdefinierte Konfigurationsabschnitte umfassen. Ein gutes Beispiel dafür ist ELMAH. Eine Datei web.config für ELMAH könnte wie folgt aussehen:

<configuration> 

    <configSections> 
    <sectionGroup name="elmah"> 
     <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" /> 
     <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" /> 
    </sectionGroup> 
    </configSections> 

    <connectionStrings> 
    <add 
     name="MyElmahDatabase" 
     providerName="System.Data.SqlClient" 
     connectionString="Server=tcp:myServer.database.windows.net,1433;Database=myDB;User [email protected];Password=password;Trusted_Connection=False;Encrypt=True;Connection Timeout=30" /> 
    </connectionStrings> 

    <elmah> 
    <security allowRemoteAccess="1" /> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="MyElmahDatabase" /> 
    </elmah> 

</configuration> 

Es gibt ein paar Probleme hier:

  • Es gibt keine Möglichkeit für mich, zu aktualisieren oder zu ändern, ob Remote-Zugriff aktiviert ist zwischen Dienstkonfigurationen.

  • Es gibt keine Möglichkeit für mich, die ELMAH-Verbindungszeichenfolge zwischen Dienstkonfigurationen zu aktualisieren oder zu ändern. Diese

ist, weil die web.config verpackt ist wie in die .cspkg Datei und ELMAH wird sich nicht an den Service-Konfigurationseinstellungen (das ist der einzige Weg, die ich Konfigurationseinstellungen zwischen Service-Konfigurationen variieren kann).

ich von vielen anderen Beispielen denken kann, wo dies ein Problem ist ...

  • Alle Datenzugriffs Frameworks, die direkt an dem Verbindungszeichen Abschnitt.
  • Alle benutzerdefinierten Konfigurationseinstellungen, die ich erstellen muss.

... um nur zwei zu nennen.

Fehle ich etwas oder ist dies eine erhebliche Lücke in der Konfigurationsverwaltung von Windows Azure?

EDIT

Aus der Antwort und Kommentare unten sieht es aus wie das ist etwas, das nicht gut unterstützt wird. Ich denke, dass die Verwaltung mehrerer Lösungskonfigurationen zur Unterstützung verschiedener Konfigurationsprofile eine sehr schwache Lösung ist. Ich sollte die Lösung nicht für jedes Konfigurationsprofil neu erstellen müssen, das ich brauche (es wird wahrscheinlich einige geben). Zusammenstellung ist nicht gleich Konfiguration.

Ich frage mich, ob es eine Möglichkeit gibt, die .cspkg-Datei zu ändern, da es nur eine Zip-Datei ist. Laut Dokumentation this können Sie unter Linux.

Ich habe in der .cspkg Datei auf dem Manifest sah und es sieht wie folgt aus:

<PackageManifest version="2"> 
    <Encryption keytype="1" /> 
    <Contents hashtype="1"> 
    <Item name="MyApp.Web.UI_<GUID>.cssx" hash="AED69299C5F89E060876BC16BD3D6DE5130F6E62FFD2B752BAF293435339B7E2" uri="/MyApp.Web.UI_<GUID>.cssx" /> 
    <Item name="MyApp.Web.Services_<GUID>.cssx" hash="7AC81AFF642E4345173C8470C32A41118A4E3CFD4185B82D0ADA44B71057192D" uri="/MyApp.Web.Services_<GUID>.cssx" /> 
    <Item name="SMPackage_<GUID>.csmx" hash="B5E6B83B62AF64C7C11CAC1A394ABBF15D7DB7667A773C5284CE5BE95C5834E9" uri="/SMPackage_<GUID>.csmx" /> 
    <Item name="SDPackage_<GUID>.csdx" hash="F34B7C02A551D82BAD96881E2DA9447D0014D49B47CCB3840475BDC575234A7D" uri="/SDPackage_<GUID>.csdx" /> 
    <Item name="NamedStreamPackage_<GUID>.csnsx" hash="FA2B5829FF5D9B2D69DCDDB0E5BDEE6B8B0BC09FFBF37DAEEE41CF3F3F4D0132" uri="/NamedStreamPackage_<GUID>.csnsx" /> 
    </Contents> 
    <NamedStreams> 
    <Stream name="RequiredFeatures/MyApp.Web.Services/1.0" /> 
    <Stream name="RequiredFeatures/MyApp.Web.UI/1.0" /> 
    <Stream name="SupportData/MyApp.Web.Services/1.0" /> 
    <Stream name="SupportData/MyApp.Web.UI/1.0" /> 
    </NamedStreams> 
</PackageManifest> 

Leider, wenn ich den Hash-Wert des unverändert „MyApp.Web.UI_.cssx“ neu berechnen Datei, mein Hash unterscheidet sich von dem im Manifest.

Hash aus manifestieren: AED69299C5F89E060876BC16BD3D6DE5130F6E62FFD2B752BAF293435339B7E2

Meine berechneten Hash: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855

Bitte beachte, dass ich noch nicht die Datei geändert wird, so dass der Hash gleich sein sollte.

Das deutet darauf hin, dass ich es falsch berechne. Meine Methode war wie folgt:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (FileStream fs = new FileStream(args[0], FileMode.Open)) 
     { 
      ComputeHash(new SHA256Managed(), fs); 
     } 
    } 

    private static void ComputeHash(HashAlgorithm hashAlgorithm, Stream stream) 
    { 
     byte[] hash = hashAlgorithm.ComputeHash(stream); 
     string hashString = BitConverter.ToString(hash); 
     Console.WriteLine(hashString.Replace("-", string.Empty)); 
     Console.WriteLine(); 
    } 
} 

Die Dokumentation Link oben, schlägt es einfach ist (jedenfalls unter Linux) die Hash neu zu berechnen.

Kann jemand die Hashes neu berechnen?

+0

Sie .cscfg Dateien für alle configurables für Ihr Paket verwenden können. –

+0

Das wird nicht funktionieren - ELMAH (und andere Frameworks) werden keine Konfigurationsdaten in .cscfg ansehen. –

+0

Nun, soweit ich weiß, ist nur eine mögliche Konfigurationsmethode für azure-Pakete .cscfg-Dateien. Für die Frameworks wie ELMAH müssen Sie möglicherweise einen Workaround wie die dynamische Änderung der Konfiguration finden. Aber ich denke, es gibt viele Experten von azure auf Stackoverflow, die eine viel bessere Antwort anbieten könnten. Auch das ist eine sehr interessante und wichtige Frage. –

Antwort

0

Wenn Sie Elemente in Ihrer Datei web.config haben, die Sie je nach dem, wie sie erstellt werden, ändern möchten, können Sie eine Lösung außerhalb von Azure verwenden. Sie können Web.config transforms verwenden. Diese Transformationen sind an Ihre Build-Konfiguration gebunden, nicht an Ihre Service-Konfiguration, aber Ihre Service-Konfigurationen sind wahrscheinlich eng mit Ihren Build-Konfigurationen verbunden (... Local.csfg -> Debug, ... Cloud.csfg -> Release). Wenn die Standard-Build-Konfigurationen nicht für Sie funktionieren, erstellen Sie einfach die benötigten Builds.

Wenn Sie unterschiedliche Service-Definitionen pro Dienstkonfiguration verwendet werden soll, dann ist es nicht von der Benutzeroberfläche unterstützt, aber Sie können mess around with the build process to make it work

+0

Das könnte technisch funktionieren, aber ich müsste beginnen, Build-Konfigurationen für jede Umgebung zu verwalten. Diese Liste kann lang sein (Entwicklung, Integration, Systemtest, UAT, Produktion) und jede zusätzliche Build-Konfiguration muss erstellt werden, was die Build-Zeit erhöht. Ich möchte einen Debug-Build und einen Release-Build haben und in der Lage sein, beide in jeder Umgebung bereitzustellen. –

+0

Unabhängig davon, welche Lösung Sie verwenden, wenn Sie für jede Umgebung eine andere Datei "web.config" verwenden möchten, müssen Sie trotzdem einen Build pro Umgebung erstellen, da die Datei "web.config" als Teil des Pakets enthalten ist. Das Paket kann nach der Erstellung nicht mehr geändert werden. – knightpfhor

+0

Ich bin mir nicht sicher, ob das völlig stimmt - unter der "Debug" Build-Konfiguration kann ich "n" Anzahl von Service-Konfigurationen haben. Standardmäßig sind dies "Local" und "Cloud", wäre toll wenn ich "Local", "Cloud-Integration", "Cloud-SystemTest", "Cloud-UAT" etc. hätte. Und dass ich die Konfigurationsdateien variieren könnte für jede dieser Service-Konfigurationen.Ich sehe nicht, warum ich die gesamte Lösung neu erstellen sollte, nur um zusätzliche Konfigurationsprofile zu bewältigen - die Kompilierung ist nicht gleich der Konfiguration. –

2

Passing ein Stream zu ComputeHash() endet mit einem anderen Hash-up im Vergleich zur Verwendung der byte[] Überlastung . Ich weiß nicht warum.

Versuchen Sie so etwas wie:

private static void ComputeHash(HashAlgorithm hashAlgorithm, Stream stream) 
{ 
    BinaryReader reader = new BinaryReader(stream) 
    byte[] hash = hashAlgorithm.ComputeHash(reader.ReadBytes((int)stream.length)); 
    string hashString = BitConverter.ToString(hash); 
    Console.WriteLine(hashString.Replace("-", string.Empty)); 
    Console.WriteLine(); 
} 

Dies wird Ihnen den Hash Sie nach.

Wie Sie wahrscheinlich haben bereits entdeckt, auf Linux können Sie den Digest erhalten mit

openssl dgst -sha256 /path/to/file