Я пишу приложение, в котором необходимо разместить несколько служб WCF. Одной из сильных сторон WCF является возможность настраивать службы без необходимости перекомпиляции, путем указания параметров в файле app.config.
При самостоятельном размещении нестандартного способа не существует. для автоматического размещения служб, которые находятся в файле app.config. Я нашел этот вопрос , в котором упоминается возможное решение динамического перечисления сервисов, перечисленных в app.config, во время выполнения и создания ServiceHost для каждого.
Однако мои сервисы, контракты и хостинговое приложение - все в разных сборках. Это приводит к тому, что Type.GetType (имя строки)
не может найти мой тип службы (возвращает null
), потому что он определен в другой сборке.
Как я могу надежно разместить все службы, перечисленные в файле app.config динамически (т. е. без жесткого кодирования нового ServiceHost (typeof (MyService))
в моем приложении для самостоятельного размещения?
Примечание. Мой app.config был создан с использованием «Редактор конфигурации WCF» в Visual Studio 2010.
Также обратите внимание: моя основная цель - сделать это управляемым приложением. config, чтобы иметь единую точку настройки. Я не хочу настраивать это в отдельном месте.
РЕДАКТИРОВАТЬ : я могу читать файл app.config (см. здесь ), но мне нужно иметь возможность разрешать типы в разных сборках.
РЕДАКТИРОВАТЬ : Один из ответов ниже побудил меня попробовать указать AssemblyQualifiedName в app.config вместо простого имени базового типа. Это позволило обойти проблему Type.GetType ()
, однако ServiceHost.Open ()
теперь выдает ошибку InvalidOperationException
независимо от того, как я получил тип :
// Fails
string typeName = typeof(MyService).AssemblyQualifiedName;
Type myType = Type.GetType(typeName);
ServiceHost host = new ServiceHost(myType);
host.Open(); // throws InvalidOperationException
// Also fails
Type myType2 = typeof(MyService);
ServiceHost host2 = new ServiceHost(myType2);
host2.Open(); // throws InvalidOperationException
Сведения об исключении:
Служба SO.Example.MyService не имеет конечных точек приложения (не связанных с инфраструктурой). Это может быть связано с тем, что для вашего приложения не найден файл конфигурации, или из-за того, что в файле конфигурации не может быть найден ни один элемент службы, соответствующий имени службы, или из-за того, что в элементе службы не определены конечные точки.
Я предполагаю, что WCF пытается сопоставить буквальную строку для имени службы при анализе файла app.config файл внутри.
РЕДАКТИРОВАТЬ / ОТВЕТ : То, что я сделал, было в основном тем, что было в ответе ниже. Вместо использования Type.GetType ()
я знаю, что все мои службы находятся в одной сборке, поэтому я переключился на:
// Get a reference to the assembly which contain all of the service implementations.
Assembly implementationAssembly = Assembly.GetAssembly(typeof(MyService));
...
// When loading the type for the service, load it from the implementing assembly.
Type implementation = implementationAssembly.GetType(serviceElement.Name);