如何在ASP.NET Web应用程序中打开SectionGroup?

时间:2011-09-02 03:33:40

标签: asp.net configurationmanager

我在集成测试(在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时想要的。

有什么想法吗?

4 个答案:

答案 0 :(得分:13)

在网络应用程序中,尝试使用WebConfigurationManager。您将需要一种机制来检测您是否在Web上下文或exe上下文中,并使用一些设计模式来在上下文之间切换。 一个简单的方法是检查HttpContext.Current是否为null(非null表示Web上下文,空值表示exe上下文)。

IMO,这样的事情应该有效,

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