wcf загружен из другого файла конфигурации - PullRequest
0 голосов
/ 02 марта 2011

Я пытаюсь использовать файл конфигурации приложения по пути, отличному от пути запуска приложения.Я обнаружил, что могу изменить имя файла конфигурации с помощью:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", NewConfigFullFilename);

После этого некоторые методы работают правильно, например.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) загружает нужный файл, другие методы не работают, например.ConfigurationManager.GetSection("system.serviceModel/client") не загружает раздел из файла.

Я нашел это, потому что мне нужно создавать службы или фабрики каналов, используя файл конфигурации.Запись:

channelFactory = new ChannelFactory<TContract>(EndpointConfigurationName);

У меня сбой, потому что, я полагаю, внутренний код использует метод GetSection.Я просмотрел приватные поля в классе ConfigurationManager и обнаружил, что экземпляр ClientConfigPaths имеет старое имя файла конфигурации в поле _applicationCongiUri, в то время как в статическом поле s_current указано правильное имя файла.Я использовал следующий код для правильного изменения значений 2 полей и этого wortk, загружая сервисы из нового файла конфигурации:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", NewConfigFullFilename);
FieldInfo field = typeof(ConfigurationManager).GetField("s_initLock", BindingFlags.Static | BindingFlags.NonPublic); 
object lockobj = field.GetValue(null); 
lock (lockobj) 
{
    typeof(ConfigurationManager).GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, 0); 
}
field = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.Static | BindingFlags.NonPublic); 
object s_configSystem = field.GetValue(null); 
field = s_configSystem.GetType().GetField("_configHost", BindingFlags.Instance | BindingFlags.NonPublic); 
object _configHost = field.GetValue(s_configSystem); 
field = _configHost.GetType().GetField("_configPaths", BindingFlags.Instance | BindingFlags.NonPublic); 
object _configPaths = field.GetValue(_configHost); 
field = _configPaths.GetType().GetField("_applicationConfigUri", BindingFlags.Instance | BindingFlags.NonPublic); 
field.SetValue(_configPaths, NewConfigFullFilename); 
field = _configPaths.GetType().GetField("_localConfigFilename", BindingFlags.Instance | BindingFlags.NonPublic); 
field.SetValue(_configPaths, NewConfigFullFilename);

Теперь я хотел бы знать, есть ли другие способысделать это, или если это ошибка, что AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE" недостаточно, или любое другое предложение.

Спасибо

1 Ответ

0 голосов
/ 03 марта 2011

Рассмотрите возможность реализации пользовательских ServiceHost и ChannelFactory<TChannel>DuplexChannelFactory<TChannel>, если требуется хотя бы одна дуплексная операция).

Вы можете передать экземпляр класса Configuration их конструкторам и использоватьсоответствующие разделы извлекаются через этот экземпляр при необходимости.

Это может потребовать больше работы, чем вы уже проделали, но код наверняка будет более аккуратным с чем-то вроде этого:

// Use path to relevant configuration file
string configPath = null;
Configuration config = ConfigurationManager.OpenExeConfiguration( configPath );
CustomServiceHost host = new CustomServiceHost( typeof( Service ), config );
host.Open();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...