我的配置设置去哪儿了?
Where have my config settings gone?
在经历了一些漫长而复杂的故事之后,我发现了与此非常相似的代码,并且已经使用了几个月。昨天我改了很多东西,现在这段代码不能用了。
public void OpenConfig(string configDir)
{
if (string.IsNullOrWhiteSpace(configDir))
{
configDir = AppDomain.CurrentDomain.BaseDirectory;
}
var sharedConfigPath = Path.Combine(configDir, ConfigFileName);
var map = new ExeConfigurationFileMap { ExeConfigFilename = sharedConfigPath };
sharedConfig = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
logger.Trace("'{0}' set 'SharedConfigPath' to '{1}'.", GetType().Name, sharedConfig.FilePath);
}
然后,我得到这样的配置值:
ServicePollingInterval = GetIntegerAppSetting("ServicePollingInterval"),
哪里
private static int GetIntegerAppSetting(string settingName, bool throwOnMissing = false)
{
string setting = null;
if (settingTag != null)
var settingTag = sharedConfig.AppSettings.Settings[settingName];
{
setting = settingTag.Value;
}
if (setting == null)
{
if (throwOnMissing)
{
logger.Trace("App Setting '{0}' not configured. Throwing an exception.", settingName);
throw new EalsConfigurationException(settingName, "App Setting not configured.");
}
logger.Trace("App Setting '{0}' not configured. Defaulting to -1.", settingName);
return -1;
}
int i;
if (!int.TryParse(setting, out i))
{
logger.Trace("App Setting '{0}' not valid as Integer. Throwing an exception.", settingName);
throw new EalsConfigurationException(setting, "App Setting '{0}' not valid as Integer.");
}
return i;
}
但是,现在基本上一夜之间,调用 var settingTag = sharedConfig.AppSettings.Settings[settingName];
returns settingTag
为空,因为该集合中没有 appSettings
项。
我已经在这个项目上工作了几个月,我把这个配置代码放在了开始的地方,因为我在同一个文件夹中有几个可执行文件 运行,我希望它们都使用相同的配置。我真的很困惑(并不惊讶)我没有对配置进行任何令人难忘的代码更改。
任何人都可以看到我可能搞砸了什么,或者猜猜我可能改变了哪些外部影响,或者任何可能突然导致此 Configuration
对象的所有部分都为空的东西。
我有一个怀疑,但无法追踪,是该应用程序运行的用户发生了变化。这很复杂:我有一个 WCF 服务托管在 Windows 服务中,由 WPF 应用程序使用。
通过反复试验得出了某种答案。当使用单独的 WCF 库、主机和客户端项目进行编码和调试时,您需要在所有三个项目中使用相同的配置设置。有时 VS2013(我不知道其他人)自动托管 WCF 库,在某个地方的某个未知进程中,因此你需要库项目中的 app.config
副本,即使它不是可执行文件。
在经历了一些漫长而复杂的故事之后,我发现了与此非常相似的代码,并且已经使用了几个月。昨天我改了很多东西,现在这段代码不能用了。
public void OpenConfig(string configDir)
{
if (string.IsNullOrWhiteSpace(configDir))
{
configDir = AppDomain.CurrentDomain.BaseDirectory;
}
var sharedConfigPath = Path.Combine(configDir, ConfigFileName);
var map = new ExeConfigurationFileMap { ExeConfigFilename = sharedConfigPath };
sharedConfig = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
logger.Trace("'{0}' set 'SharedConfigPath' to '{1}'.", GetType().Name, sharedConfig.FilePath);
}
然后,我得到这样的配置值:
ServicePollingInterval = GetIntegerAppSetting("ServicePollingInterval"),
哪里
private static int GetIntegerAppSetting(string settingName, bool throwOnMissing = false)
{
string setting = null;
if (settingTag != null)
var settingTag = sharedConfig.AppSettings.Settings[settingName];
{
setting = settingTag.Value;
}
if (setting == null)
{
if (throwOnMissing)
{
logger.Trace("App Setting '{0}' not configured. Throwing an exception.", settingName);
throw new EalsConfigurationException(settingName, "App Setting not configured.");
}
logger.Trace("App Setting '{0}' not configured. Defaulting to -1.", settingName);
return -1;
}
int i;
if (!int.TryParse(setting, out i))
{
logger.Trace("App Setting '{0}' not valid as Integer. Throwing an exception.", settingName);
throw new EalsConfigurationException(setting, "App Setting '{0}' not valid as Integer.");
}
return i;
}
但是,现在基本上一夜之间,调用 var settingTag = sharedConfig.AppSettings.Settings[settingName];
returns settingTag
为空,因为该集合中没有 appSettings
项。
我已经在这个项目上工作了几个月,我把这个配置代码放在了开始的地方,因为我在同一个文件夹中有几个可执行文件 运行,我希望它们都使用相同的配置。我真的很困惑(并不惊讶)我没有对配置进行任何令人难忘的代码更改。
任何人都可以看到我可能搞砸了什么,或者猜猜我可能改变了哪些外部影响,或者任何可能突然导致此 Configuration
对象的所有部分都为空的东西。
我有一个怀疑,但无法追踪,是该应用程序运行的用户发生了变化。这很复杂:我有一个 WCF 服务托管在 Windows 服务中,由 WPF 应用程序使用。
通过反复试验得出了某种答案。当使用单独的 WCF 库、主机和客户端项目进行编码和调试时,您需要在所有三个项目中使用相同的配置设置。有时 VS2013(我不知道其他人)自动托管 WCF 库,在某个地方的某个未知进程中,因此你需要库项目中的 app.config
副本,即使它不是可执行文件。