Различия в поведении между System.Web.Configuration.WebConfigurationManager и System.Configuration.ConfigurationManager

У меня были некоторые проблемы на тестовом сервере с веб-сайтом ASP.NET. Я дурачился, и домашний каталог веб-сайта по умолчанию указывал на неправильное место. Когда я попробовал:

ConfigurationManager.ConnectionStrings["connectionString"]; 

он возвратил ноль, но

using System.Web.Configuration;

/* ... */

var rootWebConfig =
    WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

rootWebConfig.ConnectionStrings.ConnectionStrings["connectionString"].ConnectionString;` 

вернул правильную строку подключения.

Каковы все различия между этими двумя подходами?

РЕДАКТИРОВАТЬ: я действительно спрашиваю, почему ConfigurationManager сбой подхода, когда домашний каталог задан неправильно, но в противном случае это происходит успешно, и WebConfigurationManager удается независимо от того, правильно ли установлен домашний каталог? Есть ли другие различия, такие как предположения об управлении доступом?

2 ответа

Решение

Попробуй это:

Поместите точку останова там, где находится оператор ConfigurationManager, и выполните следующее в окне "Немедленный вывод". ((ConfigurationSection) ConfigurationManager.GetSection("connectionStrings")).ElementInformation, Мой компьютер сообщает Источник: "C: \ Users \ John \ Documents \ Visual Studio 2008 \ Projects \ StackruCode\WebApplication1\web.config", как показано ниже.

Примечание: ниже также показано, что у меня есть доступ к ASP.NET web.config.

{System.Configuration.ElementInformation}
    Errors: {System.Configuration.ConfigurationException[0]}
    IsCollection: true
    IsLocked: false
    IsPresent: true
    LineNumber: 17
    Properties: {System.Configuration.PropertyInformationCollection}
    Source: "C:\\Users\\John\\Documents\\Visual Studio 2008\\Projects\\StackruCode\\WebApplication1\\web.config"
    Type: {Name = "ConnectionStringsSection" FullName = "System.Configuration.ConnectionStringsSection"}
    Validator: {System.Configuration.DefaultValidator}

И когда я бегу ConfigurationManager.ConnectionStrings.ElementInformation Я получаю Source: null, который подходит для моего веб-приложения.

Что вы получаете за исходный путь конфигурации???


Непосредственное предположение

ConfigurationManager.ConnectionStrings["connectionString"]; может искать местоположение конфигурации, которое не обязательно совпадает с корневым каталогом веб-приложения web.config. Скорее всего, он ищет в каталоге Windows (например, в другом месте или для machine.config). Попытка найти подходящий тест для этого, хотя.


Намерения каждого менеджера

Конфигурация системы. ConfigurationManager может обращаться к XML-формату конфигурации.NET, что означает, что он читает оба:

  • веб-конфигурации (т.е. файл web.config в ASP.NET)
  • и не веб-конфигурации (например, файл app.config - автономное консольное приложение, приложение Windows и т. д.)

и выражает те аспекты, которые являются общими для типов конфигурации. Это диспетчер конфигурации общего назначения. (Однако, несмотря на эту возможность просмотра обоих типов конфигов, вы должны использовать их для конфигов приложений, потому что веб-менеджер посвящен веб-конфигам, как описано далее...)

System.Web.Configuration. WebConfigurationManager делает почти то же самое, но представляет собой "вебизированную" версию менеджера конфигурации, предоставляющую доступ к веб-аспектам конфигурации ASP.NET (например, к файлу web.config в ASP.NET).

сходства

См. Сходства элементов между ConfigurationManager.* И WebConfigurationManager.*

Оба менеджера могут, например, получить доступ к AppSettings собственность и ConnectionStrings имущество. Действительно, оба эти параметра являются общими для обоих типов конфигурации и даже находятся на одном уровне в документе XML.

Таким образом, есть много общего, однако,

Поведенческие Различия

Доступ к конфигурации: ConfigurationManager имеет методы для открытия автономных конфигов приложения (т.е. App.config Myprogram.EXE) относительно приложения EXEC, тогда как WebConfigurationManager имеет методы для открытия веб-конфигурации ASP.NET относительно корневого каталога его веб-приложения на веб-сайте.

Вот основной app.config (например, открывается через "C:\winapp\app.config" из папки на диске с помощью ConfigurationManager)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings/>
  <connectionStrings/>
</configuration>

А вот простой web.config (например, открывается через "~", что означает корень веб-сайта WebConfigurationManager)

<?xml version="1.0"?>
<configuration>  
    <appSettings/>
    <connectionStrings/>

    <system.web>
        <!-- special web settings -->
    </system.web>

</configuration>

Обратите внимание на сходство. Также обратите внимание, что веб-конфигурация имеет дополнительный system.web элемент для ASP.NET.

Эти менеджеры расположены в разных сборках.

  • ConfigurationManager: System.Configuration.dll
  • WebConfigurationManager: System.Web.dll

Первый класс обеспечивает доступ к общим файлам конфигурации клиента (например, app.config), а второй - к файлам веб-приложения (например, web.config).

Другие вопросы по тегам