Как мога да посоча алтернативен конфигурационен файл за WCF клиент?

Работя върху голяма система, за която трябва да използвам WCF за достъп до уеб услуга. Моят тестов код работи добре, сега трябва да интегрирам своя WCF клиентски код в по-голямата система. Не мога да добавя към съществуващия файл „app.config“ и бих искал да посоча отделен .config файл за използване от моя клиентски код.

Как най-добре мога да постигна това?

Благодаря!


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


Отговори (5)


Има 2 варианта.

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

Ако работите директно с канали, .NET 4.0 и .NET 4.5 имат ConfigurationChannelFactory. Примерът в 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();

Както беше посочено от Langdon, можете да използвате адреса на крайната точка от конфигурационния файл, като просто подадете null, като това:

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

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

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

Ако работите с генерирани от код проксита, можете да прочетете конфигурационния файл и да заредите ServiceModelSectionGroup. Има малко повече работа, отколкото просто да използвате 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