문제

저는 기존 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
}

Ismaeel의 답변은 일반적으로 작동하지만 한 가지 문제를 발견했습니다. 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

기본적으로 시계를 착용하면 configuration.SectionGroups, system.net이 섹션 그룹으로 등록되지 않았으므로 일반 채널을 통해 액세스할 수 없다는 것을 알 수 있습니다.

이 문제를 해결하기 위해 제가 찾은 두 가지 방법이 있습니다.내가 좋아하지 않는 첫 번째 방법은 시스템 섹션 그룹을 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!

나는 여기에 제공된 답변 중 어느 것도 .NET 디자이너가 의도한 대로 이러한 기능을 사용하고 있지 않다고 감히 말할 수 있습니다.그러나 이것이 나에게는 효과가 있는 것 같습니다.

이스마엘의 답변 외에도 방법은 OpenMappedMachineConfiguration() 항상 Configuration 물체.따라서 로드되었는지 확인하려면 다음을 확인해야 합니다. HasFile 여기서 true는 파일에서 가져온 것임을 의미합니다.

다음과 같이 워드 호스팅 .nET 구성 요소에 구성 값을 제공했습니다.

MS Word에서 호출/호스팅되는 .NET 클래스 라이브러리 구성 요소입니다.내 구성 요소에 구성 값을 제공하기 위해 C:\Program Files\Microsoft Office\OFFICE11 폴더에 winword.exe.config를 만들었습니다.기존 .NET에서와 마찬가지로 구성 값을 읽을 수 있어야 합니다.

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

허용된 답변이 잘못되었습니다!!

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);

ASP.NET의 경우 WebConfigurationManager를 사용하세요.

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

XML 처리 사용:

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

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

이것은 트릭을 수행해야합니다 :

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top