Verwenden von ConfigurationManager zum Laden von config von einem beliebigen Ort aus

  • Ich entwickle eine Datenzugriffskomponente, die in einer Website verwendet wird, die eine Mischung aus klassischen ASP- und ASP.NET-Seiten enthält, und brauche eine gute Möglichkeit, ihre Konfigurationseinstellungen zu verwalten.

    Ich möchte eine benutzerdefinierte ConfigurationSection verwenden, und für die ASP.NET-Seiten funktioniert das hervorragend. Wenn die Komponente jedoch über eine COM-Interop-Verbindung von einer klassischen ASP-Seite aus aufgerufen wird, wird die Komponente nicht im Kontext einer ASP.NET-Anforderung ausgeführt und hat daher keine Kenntnis von web.config.

    Gibt es eine Möglichkeit, den Befehl ConfigurationManager anzuweisen, die Konfiguration einfach von einem beliebigen Pfad zu laden (z. B. ..\web.config, wenn sich meine Assembly im Ordner /bin befindet)? Wenn dies der Fall ist, denke ich, dass meine Komponente darauf zurückgreifen kann, wenn der Standardwert ConfigurationManager.GetSection null für meinen benutzerdefinierten Abschnitt zurückgibt.

    Alle anderen Ansätze dazu wären möglich herzlich willkommen!

    20 March 2013
    newfurnitureyRaistlin
7 answers
  • Versuchen Sie Folgendes:

     System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
    System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
     
    07 August 2008
    Ishmaeel
  • Die Antwort von Ishmaeel funktioniert in der Regel, jedoch habe ich ein Problem gefunden: Die Verwendung von OpenMappedMachineConfiguration scheint Ihre geerbten Abschnittsgruppen von machine.config zu verlieren. Das bedeutet, dass Sie auf Ihre eigenen benutzerdefinierten Abschnitte zugreifen können (dies ist alles, was das OP wünscht), nicht jedoch die normalen Systemabschnitte. Dieser Code funktioniert beispielsweise nicht:

     ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
    Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
    MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns null
     

    Grundsätzlich, wenn Sie eine Uhr auf configuration.SectionGroups setzen Sie werden sehen, dass system.net nicht als SectionGroup registriert ist. Daher ist es über die normalen Kanäle kaum zugänglich.

    Es gibt zwei Möglichkeiten, dies zu umgehen. Die erste, die ich nicht mag, besteht darin, die Systemabschnittsgruppen neu zu implementieren, indem Sie sie aus machine.config in Ihre eigene web.config kopieren, z. B.

     <sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </sectionGroup>
    </sectionGroup>
     

    Ich bin nicht sicher, ob die Webanwendung danach korrekt ausgeführt wird, aber Sie können auf die SectionGroups richtig zugreifen.

    Die zweite Lösung ist es stattdessen, Ihre web.config als EXE-Konfiguration zu öffnen, die wahrscheinlich sowieso näher an der beabsichtigten Funktion liegt:

     ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = strConfigPath };
    Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
    MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns valid object!
     
    <| Ich wage nicht, dass keine der hier gegebenen Antworten, weder meine noch Ishmaeels, diese Funktionen in der von den .NET-Entwicklern beabsichtigten Form verwenden. Aber das scheint für mich zu funktionieren.

    29 September 2010
    Gavin
  • Zusätzlich zu Ishmaeels Antwort gibt die Methode OpenMappedMachineConfiguration() immer ein Configuration -Objekt zurück. Um zu prüfen, ob es geladen ist, sollten Sie die Eigenschaft HasFile prüfen, wobei true bedeutet, dass es aus einer Datei stammt.

    23 April 2014
    Rahil WazirGopinath
  • Ich habe die Konfigurationswerte für word hosted .nET Compoent wie folgt bereitgestellt:

    Eine .NET-Klassenbibliothek-Komponente, die in MS Word / hosted aufgerufen wird. Um meiner Komponente Konfigurationswerte bereitzustellen, habe ich die Datei winword.exe.config im Ordner C: \ Programme \ Microsoft Office \ OFFICE11 erstellt. Sie sollten Konfigurationswerte wie in Traditional .NET lesen können.

     string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
     
    22 July 2011
    abatishchevuser385411
  • Verwenden Sie die XML-Verarbeitung:

     var appPath = AppDomain.CurrentDomain.BaseDirectory;
    var configPath = Path.Combine(appPath, baseFileName);;
    var root = XElement.Load(configPath);
    
    // can call root.Elements(...)
     
    09 February 2016
    JoelFan
  • Verwenden Sie für ASP.NET WebConfigurationManager:

     var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
    (..)
    config.AppSettings.Settings["xxxx"].Value;
     
    15 July 2014
    Bananajab
  • Dies sollte den Trick tun:

     AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "newAppConfig.config);
     

    Quelle: https://www.codeproject.com/Articles/616065/Warum -Woße-und-Wie-von-NET-Konfigurationsdateien

    09 August 2018
    gatsby