私は、最初にテスト環境 (ENV-T) にデプロイされた典型的な .net Web アプリに取り組んでおり、テストが完了した後、本番環境の ENV - P に移動されます。ホスティング プロバイダーは、最初にデプロイされる代わりに、Prod に直接何もデプロイしません。テストしてから、PROD に同期します。
また、これら 2 つの環境 Env-T と Env-P はまったく異なります。そのため、Web.Config の設定も異なります。
したがって、ENV-P に何かをデプロイするには、Env-P に従って ENV-T の web.config を変更する必要があります。そして、ホスティング ベンダーにアプリケーションの同期を依頼してから、元に戻す必要があります。
この問題を解決するために、Web.config 環境を独立させることを考えました。そこで、アプリケーションが動作している現在の環境を識別し、それに応じて値をロードするカスタム ConfiguraitonManager クラスを作成しました。
高レベルのアプローチ: ENV-T フォルダーに 1 つ、ENV-P フォルダーにもう 1 つの 2 つの Web.config があります。マシン名に応じて、環境を識別します。ENV-T の場合は ENV-T フォルダーから Web.Config 値をロードし、ENV-P の場合は ENV-P フォルダーから値をロードします。
これが私のクラスです:
public static class ConfigurationManager
{
static Configuration _config;
static NameValueCollection nameValueColl;
public static NameValueCollection AppSettings
{
get
{
if (nameValueColl == null)
{
if (_config == null)
_config = LoadConfig();
nameValueColl = new NameValueCollection();
foreach (KeyValueConfigurationElement configElement in _config.AppSettings.Settings)
{
nameValueColl.Add(configElement.Key, configElement.Value);
}
}
return nameValueColl;
}
}
private static Configuration LoadConfig()
{
string basePath = string.Empty;
if (System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath != null)
{
basePath = System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath;
}
string machineName = System.Environment.MachineName;
if (machineName.Equals("MachineA"))
{
_config = WebConfigurationManager.OpenWebConfiguration(basePath + "Test");
}
else if (machineName.ToLower().Equals("MachineB"))
{
_config = WebConfigurationManager.OpenWebConfiguration(basePath + "Prod");
}
return _config;
}
}
今、私がしなければならないのは書くことだけです
ConfigurationManager.AppSettings["KEY1"]
Appsettingキー「KEY1」を読み取ると、その特定の環境の正しい値が得られます。
質問:
私は鍵を持っています
<add key="NoOfRecords" value="50"/>
。
何らかの理由で (1 日か 2 日で) 数回ヒットした後、NoOfRecords キーの値は 50 ではなく 50,50,50,50,50 になります。考えられる理由: キーを追加すると、値は「NoOfRecords」となります。 50" を、既に "NoOfRecords","50" を持つ NameValueCollection オブジェクトに対して、値を "NoOfRecords","50,50" として格納します。
しかし、これがどのように考えられるかは、このコード ブロックの直前に新しいオブジェクトを作成していて、この nameValueColl 変数の null チェックも行っているためです。