ASP.NET 自定义配置部分声明破坏 IIS 管理器配置编辑器

ASP.NET 自定义配置部分声明破坏 IIS 管理器配置编辑器

我有一个简单的.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.configconfigSections部分恢复为出厂设置。

我发现有趣的事情之一是 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>

相关内容