Конфигурация WCF ChannelFactory вне App.config? - PullRequest
5 голосов
/ 18 февраля 2011

У меня есть служба Windows, которая использует систему плагинов. Я использую следующий код в базовом классе плагина, чтобы обеспечить отдельную конфигурацию для каждой библиотеки DLL (поэтому она будет считываться из plugin.dll.config):

string dllPath = Assembly.GetCallingAssembly().Location;
return ConfigurationManager.OpenExeConfiguration(dllPath);

Эти плагины должны вызывать службы WCF, поэтому проблема, с которой я сталкиваюсь, заключается в том, что new ChannelFactory<>("endPointName") ищет только в файле App.config размещенного приложения для настройки конечной точки.

Есть ли способ просто указать ChannelFactory искать в другом файле конфигурации или каким-либо образом внедрить мой Configuration объект?

Единственный способ, которым я могу придумать, - это вручную создать объект EndPoint и Binding из значений, считанных из plugin.dll.config, и передать их одной из перегрузок ChannelFactory<>. Это действительно похоже на воссоздание колеса, и это может сильно испортить конечную точку, в которой интенсивно используются конфигурации поведения и привязки. Возможно, есть способ легко создать объекты EndPoint и Binding, передав ему раздел конфигурации?

Ответы [ 3 ]

4 голосов
/ 18 февраля 2011

Используйте отдельный AppDomain для каждого плагина. При создании домена приложения вы можете указать новый файл конфигурации.

См. http://msdn.microsoft.com/en-us/library/system.appdomainsetup.configurationfile.aspx

2 голосов
/ 16 апреля 2013

Существует 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();

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

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

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

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

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

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

0 голосов
/ 18 февраля 2011

Вот решение, которое я нашел для моего второго вопроса ... кто-то включил работу, чтобы прочитать все данные из ServiceModelSectionGroup и создать ChannelFactory.

http://weblogs.asp.net/cibrax/archive/2007/10/19/loading-the-wcf-configuration-from-different-files-on-the-client-side.aspx

Я буду использовать решение Ричарда, так как оно кажется намного чище.

...