我正在开发一个典型的 .net Web 应用程序,它首先部署在测试环境 - ENV-T,然后在完成测试后将其移动到生产环境 - P。我们的托管服务提供商不会直接在 Prod 上部署任何东西,而是首先部署它在测试上,然后他们将其同步到 PROD。
这两个环境Env-T和Env-P也是完全不同的。所以 Web.Config 设置也不同。
因此,要在 ENV-P 上部署任何内容,我们必须按照 Env-P 更改 ENV-T 的 web.config。然后要求托管供应商同步应用程序,然后我们必须恢复。
为了解决这个问题,我想使 Web.config 环境独立。所以我写了一个自定义的 ConfiguraitonManager 类,它将识别应用程序工作的当前环境并相应地加载值。
高级方法: 我们将有两个 Web.config 一个在 ENV-T 文件夹中,另一个在 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 变量进行了空检查。