0

After some long and complicated stories, I came upon code very similar to this, and have been using it fine for months. Yesterday I changed a great many things, and now this code no longer works.

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);
}

Then, I get config values like this:

ServicePollingInterval = GetIntegerAppSetting("ServicePollingInterval"),

where

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;
}

But, now basically overnight, the call var settingTag = sharedConfig.AppSettings.Settings[settingName]; returns settingTag as null, because there are no appSettings items in that collection.

I have been working on this project for months, and I put this config code in way in the beginning because I had several executables running in the same folder, and I want them to all use the same config. I am really stumped (not surprised) that I made no memorable code changes to config.

Can anyone see what I might have screwed up, or guess at what external influences I may have changed, or at anything that could suddenly cause all the sections of this Configuration object to be empty.

One suspicion I have, but cannot trace, is a change in what user that app runs as. It's complicated: I have a WCF service hosted in a Windows Services, consumed by a WPF application.

ProfK
  • 49,207
  • 121
  • 399
  • 775

1 Answers1

0

Trial and error has brought to light some sort of answer. When coding and debugging with separate WCF library, host, and client, projects, you need the same config settings in all three projects. Sometimes VS2013 (I dunno about others) auto-hosts the WCF library, in some unknown process somewhere, and for this reason you need a copy of app.config in the library project, even though it is not an executable.

ProfK
  • 49,207
  • 121
  • 399
  • 775