Tworzę komponent dostępu do danych, który będzie używany w witrynie sieci Web zawierającej połączenie klasycznych stron ASP i ASP.NET i potrzebuję dobrego sposobu zarządzania ustawieniami konfiguracji.
Chciałbym użyć niestandardowego ConfigurationSection
, a dla stron ASP.NET działa to świetnie. Ale gdy składnik jest wywoływany za pośrednictwem współdziałania COM z klasycznej strony ASP, składnik nie działa w kontekście żądania ASP.NET i dlatego nie ma wiedzy o pliku web.config.
Czy istnieje sposób, aby po ConfigurationManager
prostu załadować konfigurację z dowolnej ścieżki (np. ..\web.config
Jeśli mój zestaw znajduje się w /bin
folderze)? Jeśli tak, myślę, że mój komponent może wrócić do tego, jeśli wartość domyślna ConfigurationManager.GetSection
wróci null
do mojej sekcji niestandardowej.
Wszelkie inne podejście do tego byłoby mile widziane!
źródło
Odpowiedzi:
Spróbuj tego:
źródło
var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/web.config");
Innym rozwiązaniem jest zastąpienie domyślnej ścieżki pliku konfiguracji środowiska.
Uważam, że jest to najlepsze rozwiązanie do ładowania pliku konfiguracyjnego z nietrywialną ścieżką, w szczególności najlepszy sposób na dołączenie pliku konfiguracyjnego do dll.
Przykład:
Więcej szczegółów można znaleźć na tym blogu .
Ponadto ta druga odpowiedź ma doskonałe rozwiązanie, wraz z kodem do odświeżenia konfiguracji aplikacji i
IDisposable
obiektem do zresetowania jej z powrotem do pierwotnego stanu. Dzięki temu rozwiązaniu możesz zachować zakres tymczasowej konfiguracji aplikacji:źródło
Odpowiedź Ishmaeela generalnie działa, jednak znalazłem jeden problem, który polega na tym, że używanie
OpenMappedMachineConfiguration
wydaje się powodować utratę dziedziczonych grup sekcji z pliku machine.config. Oznacza to, że możesz uzyskać dostęp do własnych sekcji niestandardowych (czyli wszystkich potrzebnych OP), ale nie do normalnych sekcji systemu. Na przykład ten kod nie zadziała:Zasadniczo, jeśli umieścisz zegarek na
configuration.SectionGroups
, zobaczysz, że system.net nie jest zarejestrowany jako grupa SectionGroup, więc jest prawie niedostępny za pośrednictwem normalnych kanałów.Znalazłem dwa sposoby obejścia tego problemu. Pierwszym, co mi się nie podoba, jest ponowne zaimplementowanie systemowych grup sekcji poprzez skopiowanie ich z pliku machine.config do własnego web.config np.
Nie jestem pewien, czy po tym aplikacja internetowa będzie działać poprawnie, ale możesz uzyskać poprawny dostęp do sekcjiGrupy.
Drugim rozwiązaniem jest zamiast tego otwarcie pliku web.config jako konfiguracji EXE, która i tak prawdopodobnie jest bliższa zamierzonej funkcji:
Ośmielam się twierdzić, że żadna z udzielonych tutaj odpowiedzi, ani moja, ani Ishmaeel, nie wykorzystują tych funkcji tak, jak zamierzali projektanci .NET. Ale to wydaje się działać dla mnie.
źródło
Oprócz odpowiedzi Ishmaeela metoda
OpenMappedMachineConfiguration()
zawsze zwróciConfiguration
obiekt. Aby więc sprawdzić, czy został załadowany, należy sprawdzićHasFile
właściwość, gdzie prawda oznacza, że pochodzi z pliku.źródło
Przyjęta odpowiedź jest nieprawidłowa !!
Zgłasza następujący wyjątek podczas uzyskiwania dostępu do właściwości AppSettings:
Oto poprawne rozwiązanie:
źródło
Podałem wartości konfiguracyjne do Word Hosted .nET Compoent w następujący sposób.
Składnik biblioteki klas .NET wywoływany / hostowany w programie MS Word. Aby zapewnić wartości konfiguracyjne dla mojego komponentu, utworzyłem winword.exe.config w folderze C: \ Program Files \ Microsoft Office \ OFFICE11. Powinieneś być w stanie odczytać wartości konfiguracji, tak jak robisz to w tradycyjnym .NET.
źródło
W przypadku ASP.NET użyj WebConfigurationManager:
źródło
Użyj przetwarzania XML:
źródło
To powinno załatwić sprawę:
Źródło: https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files
źródło