Mik*_*ell 121 asp.net configuration asp-classic
我正在开发一个数据访问组件,该组件将用于包含经典ASP和ASP.NET页面混合的网站,并且需要一种管理其配置设置的好方法.
我想使用自定义ConfigurationSection
,对于ASP.NET页面,这非常有用.但是当从传统的ASP页面通过COM interop调用组件时,组件不会在ASP.NET请求的上下文中运行,因此不了解web.config.
有没有办法告诉ConfigurationManager
只需从任意路径加载配置(例如,..\web.config
如果我的程序集在/bin
文件夹中)?如果有,那么我认为我的组件可以回退到如果默认ConfigurationManager.GetSection
返回null
我的自定义部分.
任何其他方法都欢迎!
Ish*_*eel 122
试试这个:
System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
Run Code Online (Sandbox Code Playgroud)
Sat*_*ies 66
另一种解决方案是覆盖默认环境配置文件路径.
我发现它是非平凡路径配置文件加载的最佳解决方案,特别是将配置文件附加到dll的最佳方法.
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);
Run Code Online (Sandbox Code Playgroud)
例:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");
Run Code Online (Sandbox Code Playgroud)
更多细节可以在这个博客上找到.
此外,这个其他答案有一个很好的解决方案,包括刷新应用程序配置的代码和一个IDisposable
将其重置回原始状态的对象.使用此解决方案,您可以保持临时应用程序配置作用域:
using(AppConfig.Change(tempFileName))
{
// tempFileName is used for the app config during this context
}
Run Code Online (Sandbox Code Playgroud)
Gav*_*vin 40
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
Run Code Online (Sandbox Code Playgroud)
基本上,如果你把手表放在上面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>
Run Code Online (Sandbox Code Playgroud)
我不确定Web应用程序本身是否会在此之后正确运行,但您可以正确访问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!
Run Code Online (Sandbox Code Playgroud)
我敢说这里提供的答案都没有,我的或者Ishmaeel都没有使用.NET设计者的意图.但是,这似乎对我有用.
Jos*_*gle 10
除了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);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
95923 次 |
最近记录: |