我正在开发一个典型的.net网络应用程序,该应用程序首先部署在测试环境中 - ENV-T 然后在完成测试后将其移至Production ENV - P. 我们的托管服务提供商不会直接在Prod上部署任何内容,而是首先部署在Test上,然后将它们同步到PROD。
这两个环境Env-T和Env-P完全不同。所以Web.Config设置也不同。
因此,要在ENV-P上部署任何内容,我们必须根据Env-P更改ENV-T的web.config。然后要求托管供应商同步应用程序,然后我们必须还原。
为了解决这个问题,我想到让Web.config环境独立。所以我编写了一个自定义的ConfiguraitonManager类,它将识别应用程序正在其中工作的当前环境,并相应地加载值。
高级方法:我们将在ENV-T文件夹中有两个Web.config,在ENV-P文件夹中有另一个。根据机器名称,我们将识别环境。如果是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"/>
。
出于某种原因,经过几次点击(一天或两天)后,我获得的NoOfRecords键值为50,50,50,50,50而不是50。 可能的原因: 如果我添加一个键,值为“NoOfRecords”,“50”,表示已经有“NoOfRecords”,“50”的NameValueCollection对象,它将值存储为 “NoOfRecords”, “50,50”。
但是再次如何这可能导致在此代码块之前我正在创建一个新对象,并且我对此nameValueColl变量进行了空检查。