Как открыть SectionGroup в веб-приложении ASP.NET? - PullRequest
10 голосов
/ 02 сентября 2011

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

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

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

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

ConfigurationManager.GetSection(SectionName)

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

Есть идеи?

Ответы [ 4 ]

13 голосов
/ 02 сентября 2011

Внутри веб-приложения попробуйте использовать 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

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

5 голосов
/ 21 января 2013
ConfigurationManager.GetSection("SectionGroupName/GroupName")

ieeg

<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 голосов
/ 02 сентября 2011
System.Configuration.Configuration config =
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
return config.GetSectionGroup(SectionGroupName);

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

0 голосов
/ 22 июля 2016

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