Как открыть SectionGroup в веб-приложении ASP.NET?

У меня есть небольшое веб-приложение ASP.NET, размещенное в интеграционном тесте (выполняется в NUnit). Мой код продукта обычно может найти данные конфигурации из файла web.config или app.config, но по какой-то причине при размещении ASP.NET я получаю ArgumentException при выполнении первой из этих команд:

var configuration = ConfigurationManager.OpenExeConfiguration(null);
return configuration.GetSectionGroup(SectionGroupName);

exePath должен быть указан, если он не работает внутри автономного исполняемого файла.

Я не знаю, что здесь поставить. Для моего продукта не существует разумного exePath, который мог бы когда-либо передавать этот метод в качестве параметра, поскольку он обычно выполняется на веб-сервере. Кроме того, обычные разделы (не группы разделов) обычно можно открыть с помощью:

ConfigurationManager.GetSection(SectionName)

даже в модульных тестах это работает, когда файл App.config каким-то волшебным образом читается. Это то, что я хотел бы, читая SectionGroups.

Любые идеи?


person Andrew Arnott    schedule 02.09.2011    source источник


Ответы (4)


System.Configuration.Configuration config =
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
return config.GetSectionGroup(SectionGroupName);

должно работать в asp.net.

person onof    schedule 02.09.2011
comment
@onof у меня не работает (.NET 4.5)... :/ Я что-то пропустил? - person Alfero Chingono; 31.01.2014
comment
Вы можете использовать для ASP.NET: if (System.Web.HttpContext.Current != null) configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); - person Kiquenet; 16.06.2016

Внутри веб-приложения попробуйте использовать WebConfigurationManager. . Вам понадобится механизм, чтобы определить, находитесь ли вы в веб-контексте или в контексте exe, и использовать какой-либо шаблон проектирования для переключения между контекстами. Простой способ сделать это — проверить, является ли HttpContext.Current значением null (не значение null указывает на веб-контекст, а значение null указывает на контекст 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.

Я не проверял это.

person Kiran    schedule 02.09.2011
comment
Спасибо. По крайней мере, в случае размещенного ASP.NET HttpContext.Current.Request.ApplicationPath равно null, и я получаю объект Configuration из файла web.config машины, а не из файла web.config веб-сайта. Любые идеи? - person Andrew Arnott; 02.09.2011
comment
Что ж, нужен механизм для получения виртуального пути. Вы можете попробовать appdomainappvirtualpath. Но если решение onof работает, это звучит как более простой способ сделать это. - person Kiran; 02.09.2011
comment
Решение @onof у меня не сработало, и HttpContext.Current.Request не было доступно в тот момент, когда я это вызывал, но WebConfigurationManager.OpenWebConfiguration("/"); работало нормально - person Neil; 09.01.2014
comment
Использование OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath); не обязательно, ИМХО. - person Kiquenet; 16.06.2016

ConfigurationManager.GetSection("SectionGroupName/GroupName")

i.e. 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;
person Đonny    schedule 21.01.2013
comment
Это сработало для меня, но с использованием System.Web.Configuration.WebConfigurationManager.GetSection - person downwitch; 08.06.2013

Публикация на случай, если это кому-нибудь поможет. Я использовал этот ответ, чтобы прочитать конфигурацию 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;
    }
person GELR    schedule 22.07.2016