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の構成エディターを開くと:
次に、セクションのドロップダウンリストからSimpleConfigGroup
を選択すると、次のあいまいなエラーが報告されます。
「この操作の実行中にエラーが発生しました。」
詳細:
ファイル名:\?\ e:\ sites\site1\web.config
エラー:
このエラーのスクリーンショットは次のとおりです。
サイトの<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
ファイルですでに定義されているため理解できます。
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.config
のconfigSections
セクションを工場出荷時の設定に戻しました。
私が興味深いと思ったことの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>
これは実際に機能しました!:
ASP.NETアプリケーションは引き続き機能し、カスタム構成セクションを読み取ることができます。また、IIS Managerの構成エディターでカスタム構成セクションMySetting
の値を編集できます。
次に、ASPNET_schema.xml
を工場出荷時の設定に戻し、同じ定義を使用してIISのスキーマフォルダーにカスタムSimpleConfigSchema.xml
ファイルを再作成しようとしましたが、これも機能します。
これは、なし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>