Frage

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

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

Gibt es eine Möglichkeit, das zu sagen? ConfigurationManager um die Konfiguration einfach von einem beliebigen Pfad zu laden (z. B. ..\web.config wenn meine Baugruppe in der ist /bin Ordner)?Wenn ja, denke ich, dass meine Komponente auf die Standardeinstellung zurückgreifen kann ConfigurationManager.GetSection kehrt zurück null für meinen benutzerdefinierten Bereich.

Alle anderen Ansätze dazu wären willkommen!

War es hilfreich?

Lösung

Versuche dies:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

Andere Tipps

Eine andere Lösung besteht darin, den Standardpfad der Umgebungskonfigurationsdatei zu überschreiben.

Ich finde, dass es die beste Lösung für das Laden von Konfigurationsdateien mit nicht trivialen Pfaden ist, insbesondere die beste Möglichkeit, Konfigurationsdateien an die DLL anzuhängen.

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);

Beispiel:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");

Weitere Einzelheiten finden Sie unter dieser Blog.

Zusätzlich, diese andere Antwort hat eine ausgezeichnete Lösung, komplett mit Code, um die App -Konfiguration zu aktualisieren und eine IDisposable Objekt, um es in seinen ursprünglichen Zustand zurückzusetzen.Mit dieser Lösung können Sie die temporäre App -Konfiguration beibehalten:

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}

Ishmaeels Antwort funktioniert im Allgemeinen, ich habe jedoch ein Problem gefunden, nämlich die Verwendung OpenMappedMachineConfiguration scheint Ihre geerbten Abschnittsgruppen aus machine.config zu verlieren.Das bedeutet, dass Sie auf Ihre eigenen benutzerdefinierten Abschnitte zugreifen können (was alles ist, was das OP wollte), aber nicht auf 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

Im Grunde genommen, wenn man eine Uhr anlegt configuration.SectionGroups, werden Sie sehen, dass system.net nicht als SectionGroup registriert ist und daher über die normalen Kanäle so gut wie nicht zugänglich ist.

Ich habe zwei Möglichkeiten gefunden, dies zu umgehen.Die erste, die mir nicht gefällt, besteht darin, die Systemabschnittsgruppen erneut zu implementieren, indem man sie aus machine.config in Ihre eigene web.config kopiert, 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 selbst danach ordnungsgemäß ausgeführt wird, aber Sie können korrekt auf die Abschnittsgruppen zugreifen.

Die zweite Lösung besteht stattdessen darin, Ihre web.config als EXE-Konfiguration zu öffnen, was wahrscheinlich ohnehin 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 gehe davon aus, dass keine der hier bereitgestellten Antworten, weder meine noch die von Ishmaeel, diese Funktionen ganz so nutzt, wie es die .NET-Designer beabsichtigt hatten.Aber das scheint bei mir zu funktionieren.

Zusätzlich zu Ishmaeels Antwort die Methode OpenMappedMachineConfiguration() werde immer a zurückgeben Configuration Objekt.Um also zu überprüfen, ob es geladen wurde, sollten Sie Folgendes überprüfen HasFile Eigenschaft, wobei true bedeutet, dass sie aus einer Datei stammt.

Ich habe die Konfigurationswerte für Word-gehostete .nET-Komponenten wie folgt bereitgestellt.

Eine .NET-Klassenbibliothekskomponente, die in MS Word aufgerufen/gehostet wird.Um meiner Komponente Konfigurationswerte bereitzustellen, habe ich winword.exe.config im Ordner C:\Programme\Microsoft Office\OFFICE11 erstellt.Sie sollten in der Lage sein, Konfigurationswerte wie in traditionellem .NET zu lesen.

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];

Die akzeptierte Antwort ist falsch!!

Beim Zugriff auf die AppSettings-Eigenschaft wird die folgende Ausnahme ausgelöst:

Das Objekt vom Typ „System.Configuration.DefaultSection“ kann nicht in den Typ „System.Configuration.AppSettingsSection“ umgewandelt werden.

Hier ist die richtige Lösung:

System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

Für ASP.NET verwenden Sie WebConfigurationManager:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;

Nutzen Sie die XML-Verarbeitung:

var appPath = AppDomain.CurrentDomain.BaseDirectory;
var configPath = Path.Combine(appPath, baseFileName);;
var root = XElement.Load(configPath);

// can call root.Elements(...)

Dies sollte den Zweck erfüllen:

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

Quelle : https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top