我有一个简单的.NET 自定义配置组件,它允许我在我的 ASP.NET 2.0(Web 项目目标为 .NET Framework 3.5)Web 应用程序的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
:
简单配置组.cs:
using System.Configuration;
namespace CustomSettingsLib
{
public class SimpleConfigGroup : ConfigurationSectionGroup
{
[ConfigurationProperty("SimpleConfigSection")]
public SimpleConfigSection SimpleConfigSection
{
get { return (SimpleConfigSection)this.Sections["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);
}
}
}
这很有效,我的 Web 应用程序可以MySetting
从我的web.config
文件中读取该值。
由于这些设置将在 Windows 2008 R2+IIS7.5 上的许多 Web 应用程序中使用,因此我创建了一个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>
然后我在元素中的 IISapplicationHost.config
文件中添加了以下部分定义<configSections>
:
<section name="SimpleConfigGroup"
overrideModeDefault="Allow"
allowDefinition="Everywhere" />
我遇到的问题是,当我打开 IIS 管理器的站点配置编辑器时:
SimpleConfigGroup
然后从部分下拉列表中选择,它会报告以下模糊错误:
“执行此操作时出错。”
详细信息:
文件名:\?\e:\sites\site1\web.config
错误:
这是此错误的屏幕截图:
<sectionGroup>
如果我从站点文件中删除 .NET声明web.config
,我可以使用 IIS 管理器的配置编辑器编辑自定义设置。但是我的 Web 应用程序无法运行,因为<sectionGroup>
自定义配置部分和 .NET 解析文件都需要配置信息web.config
。
我尝试将其添加<sectionGroup>
到根目录machine.config
(甚至将配置程序集放入 .NET 2.0 框架程序集文件夹),但仍然出现相同的错误。我还尝试对配置程序集进行签名,认为可能存在信任问题,但这也无济于事。
我觉得奇怪的是,通常的 .NET Framework<configSections>
不会扰乱 IIS 管理器配置管理器, ASP.NET 2.0 站点中的machine.config
.NET 3.5 System.Web.Extensions 定义也不会,例如,我的自定义配置部分会。<sectionGroup>
system.web
这是为什么?这是 IIS 管理器配置编辑器中的错误吗?
更新:
根据 Scott 的建议,我将以下内容添加到我的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 管理器的配置设置编辑器现在可以再次看到该部分而不会出现错误,但由于 ASP.NET 应用程序中没有部分声明,因此web.config
会引发“无法识别的配置部分”例外。
我也尝试过这个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
配置部分声明,以便 ASP.NET 应用程序可以读取自定义配置值。我从 IIS 架构文件夹中删除了客户架构文件,并将applicationHost.config
的configSections
部分恢复为出厂设置。
我发现有趣的事情之一是 IIS 管理器的配置编辑器公开了设置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 管理器的配置编辑器和 ASP.NET 都需要使用相同的部分)有点虚假。
答案1
嘿,Kev。使用你的例子,我很快就能做到。下面是我放置所有内容的地方:
小路:
%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>