Назад | Перейти на главную страницу

Объявление раздела настраиваемой конфигурации ASP.NET нарушает работу редактора конфигурации диспетчера IIS

У меня есть простой компонент настраиваемой конфигурации .NET, который позволяет мне указать настраиваемую группу конфигурации и раздел в моем веб-приложении ASP.NET 2.0 (веб-проект нацелен на .NET Framework 3.5). web.config файл:

В моем web.config У меня есть следующие объявления:

<configuration>

  <configSections>
    <sectionGroup 
      name="SimpleConfigGroup"
      type="CustomSettingsLib.SimpleConfigGroup, CustomSettingsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7a58d3af5d6768c9">
      <section 
        name="SimpleConfigSection"
        type="CustomSettingsLib.SimpleConfigSection, CustomSettingsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7a58d3af5d6768c9"/>
    </sectionGroup>
  </configSections>

  <SimpleConfigGroup>
    <SimpleConfigSection MySetting="Hello World" />
  </SimpleConfigGroup>

</configuration>

Есть несколько классов, которые обеспечивают доступ к этому разделу настраиваемой конфигурации, которые находятся в проекте библиотеки классов с именем CustomSettingsLib:

SimpleConfigGroup.cs:

using System.Configuration;
namespace CustomSettingsLib
{
  public class SimpleConfigGroup : ConfigurationSectionGroup
  {
    [ConfigurationProperty("SimpleConfigSection")]
    public SimpleConfigSection SimpleConfigSection
    {
      get { return (SimpleConfigSection)this.Sections["SimpleConfigSection"]; }
    }
  }
}

SimpleConfigSection.cs:

using System.Configuration;
namespace CustomSettingsLib
{
  public class SimpleConfigSection : ConfigurationSection
  {
    [ConfigurationProperty("MySetting", IsRequired = false)]
    public string MySetting
    {
      get { return (string)this["MySetting"]; }
    }
  }
}

Код для чтения MySetting значение выглядит как (Default.aspx.cs):

using System;
using System.Configuration;
using System.Web.Configuration;
using CustomSettingsLib;

namespace WebApplication4
{
  public partial class Default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
      SimpleConfigGroup group = 
              config.GetSectionGroup("SimpleConfigGroup") as SimpleConfigGroup;
      SimpleConfigSection section = group.SimpleConfigSection;
      Response.Write(section.MySetting);
    }
  }
}

Это отлично работает, и мое веб-приложение может читать MySetting ценность от моего web.config файл.

Поскольку эти настройки будут использоваться во многих веб-приложениях в Windows 2008 R2 + IIS7.5, я затем создал Расширение схемы конфигурации IIS чтобы разрешить редактирование этого параметра в редакторе конфигурации диспетчера IIS вместо того, чтобы вручную редактировать web.config файл.

Я добавил файл расширения схемы конфигурации IIS в:

%systemroot%\system32\inetsrv\config\schema

<configSchema>
  <sectionSchema name="SimpleConfigGroup">
    <element name="SimpleConfigSection">
      <attribute name="MySetting" 
                 type="string" 
                 validationType="nonEmptyString" />
    </element>
  </sectionSchema>
</configSchema>

Затем я добавил следующее определение раздела в IIS applicationHost.config файл в <configSections> элемент:

<section name="SimpleConfigGroup" 
         overrideModeDefault="Allow" 
         allowDefinition="Everywhere" />

Проблема, с которой я сталкиваюсь, заключается в том, что когда я открываю редактор конфигурации IIS Manager для сайта:

Затем выберите SimpleConfigGroup из раскрывающегося списка раздела он сообщает следующую неопределенную ошибку:

«При выполнении этой операции произошла ошибка».
Подробности:
Имя файла: \? \ E: \ sites \ site1 \ web.config
Ошибка:

Вот снимок экрана с этой ошибкой:

Если я удалю .NET <sectionGroup> декларация с сайта web.config файл, я могу легко отредактировать пользовательскую настройку с помощью редактора конфигурации диспетчера IIS. Однако мое веб-приложение не может работать, потому что <sectionGroup> информация о конфигурации требуется для настраиваемого раздела конфигурации и для .NET, чтобы иметь возможность анализировать web.config файл.

Я пробовал добавить <sectionGroup> к корню machine.config (и даже отбрасывая сборку конфигурации в папку сборок .NET 2.0 framework), но я получаю ту же ошибку. Я также попытался подписать сборку конфигурации, думая, что может быть проблема с доверием, но это тоже не помогло.

Что мне кажется странным, так это то, что обычный .NET Framework <configSections> в machine.config не нарушайте работу диспетчера конфигурации IIS Manager, а также .NET 3.5 System.Web.Extensions. <sectionGroup> определения на сайте ASP.NET 2.0, например для system.web но мои настраиваемые разделы конфигурации это делают.

Почему это? Это ошибка редактора конфигурации диспетчера IIS?

Обновить:

Основываясь на предложении Скотта, я добавил в свой applicationHost.config файл (оставив sectionGroup/section заявление в web.config файл:

<sectionGroup name="SimpleConfigGroup">
  <section name="SimpleConfigSection" 
           allowDefinition="Everywhere" 
           overrideModeDefault="Allow" />
</sectionGroup>

Это вызывает следующую ошибку, которую можно понять, поскольку она уже определена в web.config файл:


Я попытался удалить sectionGroup/section заявление от web.config но сохраняя вышеизложенное sectionGroup декларация в applicationHost. Редактор конфигурации диспетчера IIS больше не перечисляет SimpleConfigGroup раздел.


Затем я попробовал это в applicationHost.config:

<section 
    name="SimpleConfigGroup" 
    allowDefinition="Everywhere" 
    overrideModeDefault="Allow" 
    type="CustomSettingsLib.SimpleConfigGroup, CustomSettingsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7a58d3af5d6768c9"/>

Редактор параметров конфигурации диспетчера IIS теперь может снова видеть этот раздел без ошибок, но поскольку в web.config приложение ASP.NET выдает «Нераспознанный раздел конфигурации» исключение.


Я тоже пробовал это в applicationHost.config:

<sectionGroup 
   name="SimpleConfigGroup" 
   type="CustomSettingsLib.SimpleConfigGroup, CustomSettingsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7a58d3af5d6768c9">
  <section 
    name="SimpleConfigSection" 
    overrideModeDefault="Allow" 
    allowDefinition="Everywhere"
    type="CustomSettingsLib.SimpleConfigSection, CustomSettingsLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=7a58d3af5d6768c9"/>
</sectionGroup>

Опять же, без кубиков, ASP.NET бросает «Нераспознанный раздел конфигурации» исключение, а редактор конфигурации диспетчера IIS больше не перечисляет SimpleConfigGroup раздел.


Прогресс:

Я вернулся на первую базу и восстановил web.config config, чтобы приложение ASP.NET могло читать настраиваемые значения конфигурации. Я удалил файл схемы клиента из папки схемы IIS и вернулся к applicationHost.configс configSections вернуться к заводским настройкам.

Мне показалось интересным то, что редактор конфигурации IIS Manager предоставляет system.web настройки и пока для этого есть файл схемы (ASPNET_schema.xml) разделы схемы фактически не упоминаются в applicationHost.config файл. Это наводит меня на мысль, что эти файлы или sectionSchema имена обрабатываются особым образом.

Для этого я разблокировал ASPNET_schema.xml файл и добавил мое определение схемы:

<sectionSchema name="SimpleConfigGroup">
  <element name="SimpleConfigSection">
    <attribute name="MySetting" 
                     type="string" 
                     validationType="nonEmptyString" />
  </element>
</sectionSchema>

Это не сработало и SimpleConfigGroup не было видно в редакторе конфигурации диспетчера IIS. Но никаких ошибок не возникало, и приложение ASP.NET все еще могло считывать собственные значения конфигурации.

Затем я попытался следовать соглашениям, используемым в ASPNET_schema.xml файл схемы и добавил вместо этого:

<sectionSchema name="SimpleConfigGroup/SimpleConfigSection">
  <attribute name="MySetting" 
             type="string" 
             validationType="nonEmptyString" />
</sectionSchema>

Это действительно сработало !:

Приложение ASP.NET продолжает работать и может читать настраиваемый раздел конфигурации, И я могу редактировать настраиваемый раздел конфигурации. MySetting значение в редакторе конфигурации диспетчера IIS.

Я тогда прокатился ASPNET_schema.xml вернулся к заводским настройкам и попытался воссоздать кастомный SimpleConfigSchema.xml файл в папке схемы IIS, используя то же определение, и это тоже работает.

Это тоже без добавление ссылки на раздел конфигурации в applicationHost.config.

Я прихожу к выводу, что рекомендации по расширению схемы, в которой как редактор конфигурации IIS Manager, так и ASP.NET должны использовать один и тот же раздел, являются слегка надуманными.

Привет, Кев. Это сработало для меня сразу, используя ваши примеры. Вот куда я все разместил:

Дорожка:

%systemroot%\system32\inetsrv\config\schema\simpleconfig.xml

Содержание:

<configSchema>
  <sectionSchema name="SimpleConfigGroup">
    <element name="SimpleConfigSection">
      <attribute name="MySetting" 
                 type="string" 
                 validationType="nonEmptyString" />
    </element>
  </sectionSchema>
</configSchema>

Дорожка:

%systemroot%\system32\inetsrv\config\applicationHost.config (in <configSections> element).

Содержание:

<section name="SimpleConfigGroup" 
         overrideModeDefault="Allow" 
         allowDefinition="Everywhere" />

Дорожка:

Site's web.config

Содержание:

  <SimpleConfigGroup>
    <SimpleConfigSection MySetting="Hello World" />
  </SimpleConfigGroup>