我在集成测试(在NUnit中执行)中托管了一个小型ASP.NET Web应用程序。我的产品代码通常可以从web.config或app.config文件中找到配置数据,但出于某种原因,在托管ASP.NET时,我似乎在执行第一个命令时得到ArgumentException
:
var configuration = ConfigurationManager.OpenExeConfiguration(null);
return configuration.GetSectionGroup(SectionGroupName);
当不在独立的exe内部运行时,必须指定exePath。
我不知道该放什么。我的产品没有一个合理的exePath作为参数传递给这个方法,因为它通常在Web服务器中运行。此外,通常可以使用以下方式打开普通Sections(而不是SectionGroups):
ConfigurationManager.GetSection(SectionName)
即使在单元测试中,这也是可行的,其中App.config文件以某种方式神奇地被读取。这是我在阅读SectionGroups时想要的。
有什么想法吗?
答案 0 :(得分:13)
在网络应用程序中,尝试使用WebConfigurationManager。您将需要一种机制来检测您是否在Web上下文或exe上下文中,并使用一些设计模式来在上下文之间切换。 一个简单的方法是检查HttpContext.Current是否为null(非null表示Web上下文,空值表示exe上下文)。
Configuration configuration;
if (HttpContext.Current == null)
configuration = ConfigurationManager.OpenExeConfiguration(null); // whatever you are doing currently
else
configuration = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath); //this should do the trick
configuration.GetSectionGroup(sectionGroupName);
如果您不希望依赖System.web dll
,那将会更复杂我还没有测试过。
答案 1 :(得分:5)
ConfigurationManager.GetSection("SectionGroupName/GroupName")
即。 e.g。
<configSections>
<sectionGroup name="RFERL.Mvc" type="System.Configuration.ConfigurationSectionGroup, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<section name="routes" type="RFERL.Mvc.Configuration.RoutesConfigurationSection, RFERL.Mvc"/>
</sectionGroup>
</configSections>
&安培;
var config = ConfigurationManager.GetSection("RFERL.Mvc/routes") as RoutesConfigurationSection;
答案 2 :(得分:2)
System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
return config.GetSectionGroup(SectionGroupName);
应该在asp.net中运行。
答案 3 :(得分:0)
发布,以防这有助于任何人。我用这个答案能够读取Umbraco配置。
private static string CdnUrl()
{
// Unit test vs web environment
Configuration configuration;
if (HttpContext.Current == null)
{
configuration = ConfigurationManager.OpenExeConfiguration(null);
}
else
{
configuration = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
}
// Grab Umbraco config
ConfigurationSectionGroup umbracoConfiguration = configuration.GetSectionGroup("umbracoConfiguration");
FileSystemProvidersSection fileSystemProviders = (FileSystemProvidersSection)umbracoConfiguration.Sections.Get("FileSystemProviders");
// Return the information needed
var cdnUrl = fileSystemProviders.Providers["media"].Parameters["rootUrl"].Value;
return cdnUrl;
}