Как указать альтернативный файл конфигурации для клиента WCF?

Я работаю над большой системой, для которой мне нужно использовать WCF для доступа к веб-службе. Мой тестовый код работает нормально, теперь мне нужно интегрировать мой клиентский код WCF в более крупную систему. Я не могу добавить в существующий файл app.config и хотел бы указать отдельный файл .config для использования моим клиентским кодом.

Как лучше всего это сделать?

Спасибо!


person Jay    schedule 21.10.2009    source источник


Ответы (5)


Есть 2 варианта.

Вариант 1. Работа с каналами.

Если вы работаете с каналами напрямую, .NET 4.0 и .NET 4.5 имеют Фабрика каналов конфигурации. Пример на MSDN выглядит так:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "Test.config";
Configuration newConfiguration = ConfigurationManager.OpenMappedExeConfiguration(
    fileMap,
    ConfigurationUserLevel.None);

ConfigurationChannelFactory<ICalculatorChannel> factory1 = 
    new ConfigurationChannelFactory<ICalculatorChannel>(
        "endpoint1", 
        newConfiguration, 
        new EndpointAddress("http://localhost:8000/servicemodelsamples/service"));
ICalculatorChannel client1 = factory1.CreateChannel();

Как указал Лэнгдон, вы можете использовать адрес конечной точки из файла конфигурации, просто передав null, например:

var factory1 = new ConfigurationChannelFactory<ICalculatorChannel>(
        "endpoint1", 
        newConfiguration, 
        null);
ICalculatorChannel client1 = factory1.CreateChannel();

Это обсуждается в документации MSDN.

Вариант 2. Работа с прокси.

Если вы работаете с прокси-серверами, сгенерированными кодом, вы можете прочитать файл конфигурации и загрузить Сервисмоделсектионгрупп. Требуется немного больше работы, чем просто использование ConfigurationChannelFactory, но, по крайней мере, вы можете продолжать использовать сгенерированный прокси (который внутри использует ChannelFactory и управляет IChannelFactory для вас.

Пабло Сибраро показывает хороший пример здесь: Получение привязок и поведения WCF из любого источника конфигурации

person Philippe    schedule 19.04.2013
comment
Филипп. Я нашел вариант 1 довольно простым в использовании, но не могли бы вы посоветовать что-нибудь еще по варианту 2. Все, что я нашел, это количество неподдерживаемых @генераторов@, которые используют Reflection и не охватывают 100% возможных параметров конфигурации. - person Georgy Smirnov; 27.02.2014
comment
@GeorgySmirnov, вы видели ссылку на weblogs.asp.net/cibrax/archive/2010/05/11/ в варианте 2? Это показывает очень хороший пример. - person Philippe; 27.02.2014
comment
Вариант 1 приятен — очень жаль, что метод Dispose ConfigurationChannelFactory так же неисправен, как и метод ChannelFactory, только на этот раз класс запечатан, поэтому вы не можете расширить его, чтобы сделать нормальную версию. - person Medinoc; 02.07.2019

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

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

<system.serviceModel>
   <bindings configSource="bindings.config" />
   <behaviors configSource="behaviors.config" />
   <client configSource="client.config" />
   <services configSource="services.config" />
  .....
</system.serviceModel>

Таким образом, для каждого раздела внутри <system.serviceModel> можно указать внешний файл конфигурации с помощью атрибута configSource= (и пусть его не смущают красные волнистые линии Visual Studio — да, он РАБОТАЕТ!).

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

Марк

person marc_s    schedule 21.10.2009

К сожалению, в WCF нет встроенной поддержки для этого. Вы должны создать свой собственный подкласс ChannelFactory и самостоятельно загружать/анализировать файлы конфигурации. Ознакомьтесь с этим сообщением здесь, на форумах MSDN, для получения дополнительных сведений о реализации.

person Drew Marsh    schedule 21.10.2009

Или вы можете сделать это простым и легким способом — и реализовать собственный файл конфигурации, как в этом посте, который использует модель DataSet/DataTable для хранения/извлечения вашей конфигурации (включает в себя рабочий код):

(.Net) предложения по созданию конфигурационный файл для программы?

person Ron Savage    schedule 21.10.2009

Таким образом, вариант, упомянутый marc_s, РАБОТАЕТ. Игнорируйте предупреждение Visual Studio о том, что он не распознает свойство configSource в привязках и во всех других местах.

person Jayesh Modha    schedule 21.02.2013
comment
Добро пожаловать в Stack Overflow! Спасибо за ваш пост! Пожалуйста, не используйте подписи/слоганы в своих сообщениях. Ваш пользовательский ящик считается вашей подписью, и вы можете использовать свой профиль для публикации любой информации о себе, которая вам нравится. Часто задаваемые вопросы о подписях/слоганах - person Andrew Barber; 21.02.2013