Обход абсолютного пути configSource - PullRequest
3 голосов
/ 21 апреля 2011

У меня есть служба данных WCF с некоторыми методами, которые я вызываю асинхронно во время событий page_load.

Мне нужно решение для вызова этих методов из скрипта или консольного приложения, если необходимо.

Я создал консольное приложение, которое ссылается на библиотеки DLL DLL. Мне нужно продублировать некоторые переменные конфигурации, которые находятся в web.config в службе WCF, в app.config в приложении консоли.

Я хочу, чтобы app.config автоматически отражал web.config или как-то указывал консольное приложение на сервисах WCF web.config.

Мои консольное приложение и проекты wcf соседствуют друг с другом в одном и том же решении, поэтому атрибут configSource не будет работать. Никакие родительские каталоги или абсолютные пути не допускаются.

Кто-нибудь знает обходной путь для этого?

1 Ответ

3 голосов
/ 22 апреля 2011

Хорошо, я не знаю, каков ваш пользовательский раздел конфигурации, но этот класс покажет вам, как получить разделы конфигурации (в данном примере system.serviceModel / client), настройки приложения и строки подключения программным способом. Вы должны иметь возможность изменить его в соответствии с вашими потребностями.

public class ConfigManager
{
    private static readonly ClientSection _clientSection = null;
    private static readonly AppSettingsSection _appSettingSection = null;
    private static readonly ConnectionStringsSection _connectionStringSection = null;
    private const string CONFIG_PATH = @"..\..\..\The rest of your path\web.config";

    static ConfigManager()
    {
        ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap()
        {
            ExeConfigFilename = CONFIG_PATH
        };

        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

        _clientSection = config.GetSection("system.serviceModel/client") as ClientSection;
        _appSettingSection = config.AppSettings;
        _connectionStringSection = config.ConnectionStrings;
    }

    public string GetClientEndpointConfigurationName(Type t)
    {
        string contractName = t.FullName;
        string name = null;

        foreach (ChannelEndpointElement c in _clientSection.Endpoints)
        {
            if (string.Compare(c.Contract, contractName, true) == 0)
            {
                name = c.Name;
                break;
            }
        }

        return name;
    }

    public string GetAppSetting(string key)
    {
        return _appSettingSection.Settings[key].Value;
    }

    public string GetConnectionString(string name)
    {
        return _connectionStringSection.ConnectionStrings[name].ConnectionString;
    }
}

Использование:

ConfigManager mgr = new ConfigManager();

string setting = mgr.GetAppSetting("AppSettingKey");
string connectionString = mgr.GetConnectionString("ConnectionStringName");
string endpointConfigName = mgr.GetClientEndpointConfigurationName(typeof(IServiceContract));
...