web-dev-qa-db-ja.com

ASP.NETカスタム構成セクションの宣言が壊れていますIIS Manager Configuration Editor

ASP.NET 2.0(Webプロジェクトは.NET Framework 3.5を対象としています)Webアプリケーションのweb.configファイルでカスタム構成グループとセクションを指定できる単純な.NETカスタム構成コンポーネントがあります。

私の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);
    }
  }
}

これはうまく機能し、私のWebアプリケーションはweb.configファイルからMySetting値を読み取ることができます。

これらの設定はWindows2008 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>

次に、次のセクション定義をIISのapplicationHost.config要素の<configSections>ファイルに追加しました。

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

私が抱えている問題は、サイトのIIS Managerの構成エディターを開くと:

enter image description here

次に、セクションのドロップダウンリストからSimpleConfigGroupを選択すると、次のあいまいなエラーが報告されます。

「この操作の実行中にエラーが発生しました。」
詳細:
ファイル名:\?\ e:\ sites\site1\web.config
エラー:

このエラーのスクリーンショットは次のとおりです。

enter image description here

サイトの<sectionGroup>ファイルから.NETweb.config宣言を削除すると、IIS Managerの構成エディターを使用してカスタム設定を問題なく編集できます。ただし、私のWebアプリケーションでは 'カスタム構成セクションと.NETが<sectionGroup>ファイルを解析できるようにするには、web.config構成情報が必要であるため実行します。

<sectionGroup>をルートmachine.configに追加しようとしました(さらに、構成アセンブリを.NET 2.0 Frameworkアセンブリフォルダーにドロップしました)が、同じエラーが発生します。また、信頼の問題があるかもしれないと考えて構成アセンブリに署名しようとしましたが、それも役に立ちませんでした。

私が奇妙だと思うのは、<configSections>の通常の.NETFramework machine.configがIIS Manager Configuration Managerを混乱させたり、.NET 3.5 System.Webを混乱させたりしないことです。 .Extensions <sectionGroup> ASP.NET 2.0サイトでの定義(例:system.web)ですが、カスタム構成セクションではそうです。

どうしてこれなの? IIS Manager Configuration Editorのバグですか?

更新:

スコットの提案に基づいて、applicationHost.configファイルに以下を追加しました(sectionGroup/sectionファイルにweb.config宣言を残します。

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

これにより、次のエラーが生成されます。これは、web.configファイルですでに定義されているため理解できます。

enter image description here


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 Managerの構成エディターはSimpleConfigGroup セクション。


進捗状況:

ASP.NETアプリケーションがカスタム構成値を読み取れるように、一塁に戻り、web.config構成セクション宣言を元に戻しました。 IISスキーマフォルダーから顧客スキーマファイルを削除し、applicationHost.configconfigSectionsセクションを工場出荷時の設定に戻しました。

私が興味深いと思ったことの1つは、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 Managerの構成エディターに表示されませんでした。しかし、エラーはスローされず、ASP.NETアプリは引き続きカスタム構成値を読み取ることができました。

次に、ASPNET_schema.xmlスキーマファイルで使用されている規則に従ってみて、代わりにこれを追加しました。

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

これは実際に機能しました!:

enter image description here

ASP.NETアプリケーションは引き続き機能し、カスタム構成セクションを読み取ることができます。また、IIS Managerの構成エディターでカスタム構成セクションMySettingの値を編集できます。

次に、ASPNET_schema.xmlを工場出荷時の設定に戻し、同じ定義を使用してIISのスキーマフォルダーにカスタムSimpleConfigSchema.xmlファイルを再作成しようとしましたが、これも機能します。

これは、なしapplicationHost.configの構成セクションへの参照を追加することでもあります。

IIS Managerの構成エディターとASP.NETの両方が同じセクションを使用する必要があるスキーマを拡張するためのガイダンスは少し偽物であるという結論に達しました。

5
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>
3