У меня есть простой компонент настраиваемой конфигурации .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>