Я пишу приложение, которое должно содержать несколько служб WCF.Одной из сильных сторон WCF является возможность настраивать службы без перекомпиляции, указав параметры в файле app.config.
При самостоятельном размещении, по-видимому, не существует-box способ автоматического размещения служб, которые находятся в файле app.config.Я нашел этот вопрос , в котором упоминается возможное решение динамического перечисления служб, перечисленных в app.config во время выполнения, и создания ServiceHost для каждого.
Однако мои службы, контракты и приложение хостинга находятся в разных сборках.Это приводит к тому, что Type.GetType(string name)
не может найти тип моей службы (возвращает null
), поскольку он определен в другой сборке.
Как надежно разместить все службы, перечисленные в файле app.configдинамически (т.е. без жесткого кодирования new ServiceHost(typeof(MyService))
в моем приложении для самостоятельного размещения?
Примечание. Мой app.config был создан с помощью «Редактора конфигурации WCF» в Visual Studio 2010.
Примечание также: моя основная цель - чтобы это управлялось файлом app.config, чтобы была единственная точка конфигурации. Я не хочу настраивать это в отдельном месте.
EDIT : я могу прочитать файл app.config (см. здесь ), но мне нужно разрешить типы в разных сборках.
EDIT : Один из приведенных ниже ответов побудил меня попробовать указать 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
Сведения об исключении:
Service 'SO.Example.MyService' has zero application (non-infrastructure) endpoints. This might be because no configuration file was found for your application, or because no service element matching the service name could be found in the configuration file, or because no endpoints were defined in the service element.
Я полагаю, 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);