Ich erhalte einen system.configuration.settingspropertynotfoundexception-Fehler im Windows-Dienst
-
28-10-2019 - |
Frage
Ich habe eine Windows-App, die SettingsProvider zum Lesen der Konfigurationseinstellungen verwendet und Standardwerte festlegt, wenn keine Datei vorhanden ist.
Es funktioniert einwandfrei.
Ich versuche, einen Windows-Dienst zu schreiben, der diese App startet.Wenn es vom Dienst ausgeführt wird, erhalte ich System.Configuration.SettingsPropertyNotFoundException
für alle Einstellungsattribute.
Wie kann ich diese Ausnahme beheben, wenn der Dienst die App ausführt?
Lösung
Dies bedeutet einfach, dass die App die .Settings-Datei nicht lesen kann.Ich kann mir zwei mögliche Ursachen vorstellen:
-
Der Dienst wird unter einem Konto ausgeführt, das keinen Zugriff auf die Einstellungsdatei hat.(oder .config-Datei, abhängig) Dies ist unwahrscheinlich, da der Dienst die App starten kann und es nicht sinnvoll wäre, Berechtigungen für die App und nicht für die Einstellungsdatei zu haben.
-
Die Laufzeit kann die Einstellungsdatei nicht finden .Es wird erwartet, dass sich die Einstellungen im Stammstartpfad der ausführbaren Datei befinden.Stellen Sie sicher, dass es auf dem betreffenden Computer vorhanden ist.
Ein Google-Ergebnis stellte jedoch eine offensichtliche mögliche Ursache dar, an die ich nicht gedacht habe.Wurden die Einstellungen nach der letzten Kompilierung hinzugefügt?Kompilieren Sie die App in Visual Studio und versuchen Sie es erneut ...
Andere Tipps
Eine weitere mögliche Ursache ist, dass Sie einen benutzerdefinierten SettingsProvider
schreiben, der während des Initialize
s ausgelöst wird und eine Ausnahme darstellt.
In meinem Fall hatte ich Folgendes getan:
public class CustomSettingsProvider : SettingsProvider
{
public override void Initialize(string name, NameValueCollection config)
{
base.Initialize(name, config);
}
}
Da name
immer als null
übergeben wird, hat base.Initialize
einen ArgumentNullException
ausgelöst.Ich habe es behoben, indem ich einen Namen ungleich Null wie folgt übergeben habe:
public override void Initialize(string name, NameValueCollection config)
{
base.Initialize(name ?? GetType().Name, config);
}