Я работаю над типичным веб-приложением .net, которое впервые развернуто в тестовой среде - ENV-T.
а затем после полного тестирования он перемещается в производство ENV - P.
Наш хостинг-провайдер не будет развертывать что-либо непосредственно на Prod, вместо этого он сначала развертывается на Test, а затем синхронизирует его с PROD.
Также эти два окружения Env-T и Env-P совершенно разные. Поэтому настройки Web.Config тоже разные.
Таким образом, чтобы развернуть что-либо на ENV-P, мы должны изменить web.config ENV-T в соответствии с Env-P. Затем попросите поставщика хостинга синхронизировать приложение, а затем мы должны вернуться.
Чтобы решить эту проблему, я подумал о том, чтобы сделать среду Web.config независимой. Поэтому я написал собственный класс ConfiguraitonManager, который будет определять текущую среду, в которой работает приложение, и соответственно загружать значения.
Подход высокого уровня: У нас будет два файла Web.config, один в папке ENV-T и другой в папке ENV-P. В зависимости от имени машины мы будем определять среду. Если это ENV-T, загрузите значения Web.Config из папки ENV-T, а если это 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» для объекта NameValueCollection, который уже имеет «NoOfRecords», «50», он будет хранить значение как
"NoOfRecords", "50,50".
Но опять же, как это возможно, потому что перед этим блоком кода я создаю новый объект, а также у меня есть нулевая проверка для этой переменной nameValueColl.