give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

Settingsファイルの内容をASP.NETで動的に変更する方法

問題:

Web Project => ClassLibraryという依存関係があったとします。
ClassLibraryにはSettingsファイル内に各種の設定値が書き込まれています。
Webページの運用が始まると、その設定値は変更される可能性があります。
しかし、サイトの再コンパイルなしにその設定値を書き換えようとしても、Webサイトのフォルダ内にはどこにも設定値がテキストでは保存されていません。
さてどうすれば良いでしょうか?

回答:

ClassLibraryプロジェクトにあるapp.configから設定値部分(全部でなくて良い)をコピーし、Web.Configに貼り付けます。
その後、Web.Config内の設定値を書き換えます。
コピー後のWeb.Configはこんな感じになります。(ASP.NET 2.0で確認)

<?xml version="1.0"?>
<configuration>
	<!-- ↓ClassLibraryプロジェクトにあるapp.configからコピーした部分↓ -->
	<configSections>
		<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
			<section name="ClassLibrary1.Settings1" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
		</sectionGroup>
	</configSections>
	<applicationSettings>
		<ClassLibrary1.Settings1>
			<setting name="Hoge" serializeAs="String">
				<value>Hello, world!</value> <!-- ←ここを変更 -->
			</setting>
		</ClassLibrary1.Settings1>
	</applicationSettings>
	<!-- ↑ClassLibraryプロジェクトにあるapp.configからコピーした部分↑ -->
	
	<appSettings/>
	<connectionStrings/>
	<system.web>
		<compilation debug="true"/>
		<authentication mode="Windows"/>
	</system.web>
</configuration>


Webサイト側には変更した箇所しか出てこないので、ちょっと気持ち悪いですね。
Web側でしか使わない値であれば最初からWeb.Configに書いてしまうのもアリです。
しかし、データ型や変数名(キー値)が実行時解決になってしまうので、コンパイラはバグを発見できません。
また、ビジネスロジックはClassLibrary側に持たせたいので、ビジネスロジック特有の設定値はClassLibrary側で持っておきたいものです。
バッチ処理等と共有する値もあるでしょうし。


ちなみに、この方法を見つけるのに約2時間かかりました(ハマりまくりました)。
とほほ。。。