次の方法で共有


外部ファイルの構成の変更例

更新 : 2007 年 11 月

外部構成ファイルを使用して、アプリケーションの構成設定を拡張し、アプリケーションの再起動機能を有効または無効にすることにより、構成設定の変更時に状態情報を保存するかどうかを制御できます。これは、さまざまな構成ファイル セクションに適用される restartOnExternalChanges 属性によって制御されます。

サンプル Web アプリケーション ファイル

次のセクションには、configSource 属性が外部構成ファイルを指し、restartOnExternalChanges 属性の初期設定が true であるカスタム セクションでサンプル Web アプリケーションをビルドするコードが含まれています。

Web アプリケーションを実行すると、外部構成ファイルが変更されたときに行われるグローバル ポストバック カウンタに対する処理が示されます。また、このコード例では、restartOnExternalChanges が、true、既定値、または false に設定されたときにそれぞれ何が起こるかを示します。

Global.asax

サンプル Web アプリケーションは、この Global.asax ページに含まれている必要があります。グローバル ポストバック カウンタのあるページを定義するコード例を次に示します。カウンタは、アプリケーションの Default.aspx ページ (このトピックで後述) を再表示することにより生成されるポストバック要求を追跡します。

' Code that runs on application startup.
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 
    
    ' This counter is set to 0 the first time 
    ' the application starts and, thereafter, every 
    ' time it restarts.
    Dim postBackCount As Integer = 0
    
    Dim appState As HttpApplicationState = Application.Contents
    appState.Add("postBackKey", postBackCount)

End Sub 'Application_Start
// Code that runs on application startup.
void Application_Start(object sender, EventArgs e) 
{
       
        // This counter is set to 0 the first time 
        // the application starts and, thereafter, every 
        // time it restarts.
        int postBackCount = 0;
        
        HttpApplicationState appState = Application.Contents;
        appState.Add("postBackKey", postBackCount);
        
}

Default.aspx

Default.aspx ページには、Web.config ファイルにカスタム セクションを作成し、External.config ファイルに要素を追加し、ポストバック カウンタ値を表示するコードが含まれています。このページには、ポストバック カウンタの現在の値を表示する Label コントロールが含まれている必要があります。このコントロールを定義するための 1 つの方法を次のコード例に示します。

<asp:Label ID="ResultId" runat="server" style="font-weight:bold; color:Red;"/>

Default.aspx ページを定義するコード例を次に示します。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) 
        Dim extConfig As ExternalConfiguration = Nothing
        
        If Not IsPostBack Then
            ' Create an instance of the custom section.
            extConfig = New ExternalConfiguration()
        End If
                
        Dim postBackCount As Integer = _
        Fix(HttpContext.Current.Application("postBackKey"))
        'Display current counter value.
        ResultId.Text = postBackCount.ToString()
        
        HttpContext.Current.Application("postBackKey") = _
        Fix(HttpContext.Current.Application("postBackKey")) + 1
        
        extConfig.UpdateAppSettngs()
End Sub 'Page_Load
protected void Page_Load(object sender, EventArgs e)
{
        ExternalConfiguration extConfig = null;
        
        if (!IsPostBack)
        {
            // Create an instance of the cusom section.
            extConfig =
                new ExternalConfiguration();
        }

        int postBackCount =
           (int) HttpContext.Current.Application["postBackKey"];
        ResultId.Text = postBackCount.ToString();

        HttpContext.Current.Application["postBackKey"] =
            (int)HttpContext.Current.Application["postBackKey"] + 1;
 
        extConfig.UpdateAppSettngs();
}

Web.config

次のコード例に示されているように、Web.config ファイルは MyAppSettings カスタム セクションを定義します。この例では、このセクションを処理する標準的な型が使用されていますが、必要に応じて独自に型を作成できます。詳細については、「ConfigurationElement」および「ConfigurationSection」を参照してください。

<section 
    name="MyAppSettings" 
    type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
    restartOnExternalChanges="true" 
    requirePermission="false" />

External.config

External.config ファイルには、MyAppSettings カスタム セクションの詳細が含まれています。アプリケーションを初めて実行する前に、アプリケーション ルート ディレクトリに手動でこのファイルを作成する必要があります。詳細については、「セクションの要素によって継承される全般属性」の configSource 属性の説明を参照してください。この例では、コードに次の空のセクションが含まれていることを確認してください。

<MyAppSettings></ MyAppSettings>.

ExternalConfiguration.dll

ExternalConfiguration.dll ファイルには、MyAppSettings カスタム セクションを更新するコードが含まれています。アプリケーションの App_Code ディレクトリにソース コードを配置できます。この例は、アプリケーションが要求されると ASP.NET によりコンパイルされます。また、サンプル プロバイダをライブラリとしてコンパイルして、Web アプリケーションの Bin ディレクトリに配置することもできます。コマンド ラインからサンプルをコンパイルする方法を次のコード例に示します。

vbc /out: ExternalConfiguration.dll /t:library ExternalConfiguration.vb /r:System.Web.dll /r:System.Configuration.dll
csc /out: ExternalConfiguration.dll /t:library ExternalConfiguration.cs /r:System.Web.dll /r:System.Configuration.dll

ExternalConfiguration .dll ファイルをビルドするコード例を次に示します。

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Configuration
Imports System.Web.Configuration

Namespace Samples.AspNet


    Public Class ExternalConfiguration


        ' Instantiate the ExternalConfiguration type.
        Public Sub New()
            ' Access the root Web.config file.
            Dim config As System.Configuration.Configuration = _
            WebConfigurationManager.OpenWebConfiguration("/configTarget")

            ' Get the custom MyAppSettings section.
            Dim appSettings As AppSettingsSection = _
            CType(config.GetSection("MyAppSettings"), AppSettingsSection)

            ' Perform the first update.
            UpdateAppSettings()

        End Sub 'New



        ' Update the custom MyAppSettings section.
        ' Note , if the section restartOnExternalChanges attribute 
        ' is set to true, every update of the external 
        ' configuration file will cause the application 
        ' to restart.
        Public Sub UpdateAppSettings()

            Dim config As System.Configuration.Configuration = _
            WebConfigurationManager.OpenWebConfiguration("/configTarget")

            Dim appSettings As AppSettingsSection = _
            CType(config.GetSection("MyAppSettings"), AppSettingsSection)

            Dim count As Integer = appSettings.Settings.Count

            appSettings.Settings.Add("key_" + count.ToString(), _
            "value_" + count.ToString())

            config.Save()

        End Sub 'UpdateAppSettngs

    End Class 'ExternalConfiguration 

End Namespace
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Web.Configuration;

namespace Samples.AspNet
{


    public class ExternalConfiguration
    {

        // Instantiate the ExternalConfiguration type.
        public ExternalConfiguration()
        {
            // Access the root Web.config file.
            System.Configuration.Configuration config =
            WebConfigurationManager.OpenWebConfiguration(
                              "/configTarget");

            // Get the custom MyAppSettings section.
            AppSettingsSection appSettings =
                (AppSettingsSection)config.GetSection("MyAppSettings");

            // Perform the first update.
            UpdateAppSettings();
        }


        // Update the custom MyAppSettings section.
        // Note , if the section restartOnExternalChanges attribute 
        // is set to true, every update of the external 
        // configuration file will cause the application 
        // to restart.
        public void UpdateAppSettings()
        {

            System.Configuration.Configuration config =
            WebConfigurationManager.OpenWebConfiguration(
                              "/configTarget");

            AppSettingsSection appSettings =
                (AppSettingsSection)config.GetSection("MyAppSettings");

            int count = appSettings.Settings.Count;

            appSettings.Settings.Add(
                "key_" + count.ToString(), 
                "value_" + count.ToString());

            config.Save();
        }

    }
}

サンプル Web アプリケーションの使用

初めてアプリケーションを実行したときに、External.config ファイルに要素が追加されます。

Default.aspx ページを再表示するたびに、ポストバック カウンタがゼロにリセットされます。これは、既定で、MyAppSettings セクションの restartOnExternalChanges 属性が true になっているためです。

Web.config ファイルで restartOnExternalChanges 属性を false に設定した場合、External.config ファイルの変更には関係なく、ページが再表示されるたびに、ポストバック カウンタの値が増加します。これは、アプリケーション ドメインの再起動を無効にしたためです。

参照

処理手順

方法 : ConfigurationSection を使用してカスタム構成セクションを作成する

概念

構成設定の変更の管理

ASP.NET 構成の保護

参照

ConfigurationElement

ConfigurationSection

セクションの要素によって継承される全般属性

location

appSettings 要素 (全般設定スキーマ)

trace 要素 (ASP.NET 設定スキーマ)

HttpApplicationState