[asp.net] ConfigurationManager를 사용하여 임의 위치에서 구성로드
클래식 ASP와 ASP.NET 페이지가 혼합 된 웹 사이트에서 사용할 데이터 액세스 구성 요소를 개발 중이며 구성 설정을 관리하는 좋은 방법이 필요합니다.
사용자 지정을 사용하고 싶습니다 ConfigurationSection
. ASP.NET 페이지의 경우 이것은 훌륭하게 작동합니다. 그러나 구성 요소가 클래식 ASP 페이지에서 COM interop을 통해 호출 될 때 구성 요소는 ASP.NET 요청 컨텍스트에서 실행되지 않으므로 web.config에 대해 알지 못합니다.
ConfigurationManager
임의의 경로에서 구성을로드하도록 지시 하는 방법이 있습니까 (예 : ..\web.config
내 어셈블리가 /bin
폴더에있는 경우)? 그렇다면 기본 이 내 사용자 정의 섹션에 대해 ConfigurationManager.GetSection
반환 되면 내 구성 요소가 해당 구성 요소로 돌아갈 수 있다고 생각 null
합니다.
이에 대한 다른 접근 방식은 환영합니다!
답변
이 시도:
System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
답변
또 다른 해결책은 기본 환경 구성 파일 경로를 재정의하는 것입니다.
사소하지 않은 경로 구성 파일로드, 특히 구성 파일을 dll에 첨부하는 가장 좋은 방법에 대한 최상의 솔루션입니다.
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);
예:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");
자세한 내용은 이 블로그 에서 확인할 수 있습니다 .
또한 이 다른 답변 에는 앱 구성을 새로 고치는 코드와 IDisposable
원래 상태로 다시 재설정 하는 개체 가 포함 된 훌륭한 솔루션이 있습니다 . 이 솔루션을 사용하면 임시 앱 구성 범위를 유지할 수 있습니다.
using(AppConfig.Change(tempFileName))
{
// tempFileName is used for the app config during this context
}
답변
Ishmaeel의 대답은 일반적으로 작동하지만 한 가지 문제를 발견했습니다. 이는 OpenMappedMachineConfiguration
machine.config에서 상속 된 섹션 그룹을 잃는 것 같습니다. 즉, 사용자 정의 섹션 (원하는 모든 OP)에 액세스 할 수 있지만 일반 시스템 섹션에는 액세스 할 수 없습니다. 예를 들어 다음 코드는 작동하지 않습니다.
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
기본적으로에 watch를 넣으면 configuration.SectionGroups
system.net이 SectionGroup으로 등록되지 않았으므로 일반 채널을 통해 거의 액세스 할 수 없음을 알 수 있습니다.
이 문제를 해결하는 방법에는 두 가지가 있습니다. 내가 좋아하지 않는 첫 번째는 machine.config에서 자신의 web.config로 복사하여 시스템 섹션 그룹을 다시 구현하는 것입니다.
<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>
그 후 웹 응용 프로그램 자체가 올바르게 실행 될지 모르겠지만 sectionGroups에 올바르게 액세스 할 수 있습니다.
두 번째 해결책은 대신 web.config를 EXE 구성으로 여는 것입니다. 이는 어쨌든 의도 한 기능에 더 가깝습니다.
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!
나는 여기에 제공된 답변 중 내 또는 Ishmaeel이 .NET 디자이너가 의도 한 방식으로 이러한 기능을 사용하고 있다고 감히 생각하지 않습니다. 그러나 이것은 나를 위해 일하는 것 같습니다.
답변
Ishmaeel의 답변 외에도 메서드 OpenMappedMachineConfiguration()
는 항상 Configuration
객체를 반환 합니다. 따라서로드되었는지 확인하려면 HasFile
true가 파일에서 온 것을 의미 하는 속성을 확인해야 합니다.
답변
받아 들여진 대답은 틀렸다 !!
AppSettings 속성에 액세스 할 때 다음 예외가 발생합니다.
‘System.Configuration.DefaultSection’유형의 개체를 ‘System.Configuration.AppSettingsSection’유형으로 캐스팅 할 수 없습니다.
올바른 해결책은 다음과 같습니다.
System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
답변
다음과 같이 .nET Compoent 호스팅 단어에 구성 값을 제공했습니다.
MS Word에서 호출 / 호스팅되는 .NET 클래스 라이브러리 구성 요소. 구성 값을 구성 요소에 제공하기 위해 C : \ Program Files \ Microsoft Office \ OFFICE11 폴더에 winword.exe.config를 만들었습니다. 기존 .NET 에서처럼 구성 값을 읽을 수 있어야합니다.
string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
답변
ASP.NET의 경우 WebConfigurationManager를 사용하십시오.
var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;