2016-04-06 7 views
0

Ich habe ein Webprojekt, das eine Web.Config enthält. Wenn Sie diese Konfiguration bereitstellen, ändert On Deployment (in Azure) VS eine Einstellung (ClientId) in dieser Konfiguration.Verwenden Sie die Konfiguration von einem anderen Projekt in VS

<appSettings> 
<add key="ClientId" value="123456123-beef-face-96ce-12346dd8a108" /> 
</appSettings> 

Jetzt habe ich auch eine Konsolenanwendung, die die gleiche ClientId verwenden muss, die durch Einsatz der Web-Anwendung erstellt wurde. Um es noch schlimmer zu machen: Ich brauche nicht nur den Wert aus der Einstellung, sondern muss auch in der App.config (appSettings/ClientId) dieselbe Struktur haben. Beide Projekte sind in der gleichen Lösung.

Gibt es eine Möglichkeit, die gleiche Konfiguration zu verwenden oder die Einstellungen beim Erstellen/Deployment automatisch von einer Konfiguration zur anderen zu kopieren?

+1

Ja. Überprüfen Sie

+0

Leider funktioniert das nicht, weil die ClientId automatisch in die web.config geschrieben wird. –

Antwort

1

Es gibt zwei Wege, dies zu tun:

Erstens:

<appSettings configSource="appSettings.config"/>;

Property configSource Verwendung Einstellungen aus anderer Datei

Sekunde (Code ist gut und kompiliert)

Verwenden Sie so:

[Test] 
public void Publish_News_Post_From_File_Test() 
{ 

    using (AppConfig.Change(@"otherFile.dll.config")) 
    { 
     //Now use other config file 
    } 
} 

Quellcode:

public abstract class AppConfig : IDisposable 
    { 
     public static AppConfig Change(string path) 
     { 
      return new ChangeAppConfig(path); 
     } 

     public abstract void Dispose(); 

     private class ChangeAppConfig : AppConfig 
     { 
      private readonly string oldConfig = 
       AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString(); 

      private bool disposedValue; 

      public ChangeAppConfig(string path) 
      { 
       AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path); 
       ResetConfigMechanism(); 
      } 

      public override void Dispose() 
      { 
       if (!disposedValue) 
       { 
        AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig); 
        ResetConfigMechanism(); 

        disposedValue = true; 
       } 
       GC.SuppressFinalize(this); 
      } 

      private static void ResetConfigMechanism() 
      { 
       typeof(ConfigurationManager) 
        .GetField("s_initState", BindingFlags.NonPublic | 
              BindingFlags.Static) 
        .SetValue(null, 0); 

       typeof(ConfigurationManager) 
        .GetField("s_configSystem", BindingFlags.NonPublic | 
               BindingFlags.Static) 
        .SetValue(null, null); 

       typeof(ConfigurationManager) 
        .Assembly.GetTypes() 
        .Where(x => x.FullName == 
           "System.Configuration.ClientConfigPaths") 
        .First() 
        .GetField("s_current", BindingFlags.NonPublic | 
              BindingFlags.Static) 
        .SetValue(null, null); 
      } 
     } 
    } 

In using stetment Sie andere Konfigurationsdatei verwenden. Ich benutze es Projekt in Test die Produktion web.config

0

ich eine Lösung unter Verwendung von Powershell mit einem anderen Ansatz gefunden zu verwenden (als Post-Build):

$webconfig='C:\dev\mySolution\myWebProject\Web.config' 
$appConfig='C:\dev\mySolution\myConsoleApp\App.config' 

#Get Value from Web.Config: 
$webconfigDoc=New-Object System.Xml.XmlDocument 
$webconfigDoc.Load($webconfig) 
$webappsettings=$webconfigDoc.SelectSingleNode('//appSettings') 
$webclientIdNode=$webappsettings.SelectSingleNode("//add[@key='ClientId']") 
$clientId=$webclientIdNode.value 

#Set Value into App.Config: 
$appconfigDoc=New-Object System.Xml.XmlDocument 
$appconfigDoc.Load($appConfig) 
$appsettings=$appconfigDoc.SelectSingleNode('//appSettings') 
$appclientIdNode=$appsettings.SelectSingleNode("//add[@key='ClientId']") 
$appclientIdNode.value=$clientId 
$appconfigDoc.Save($appConfig) 
Verwandte Themen