Могут ли приложения, размещенные самостоятельно в WCF, автоматически создавать ServiceHosts с помощью app.config? - PullRequest
10 голосов
/ 18 сентября 2010

Когда я создаю wcf-приложение с собственным размещением, я создаю объекты ServiceHost для каждой службы, которую я хочу предоставить.Затем он просматривает файл app.config (соответствует имени сервера), а затем извлекает адрес и контракт соответствующей конечной точки.

Существует ли способ автоматического создания ServiceHosts для каждой службы, указанной в приложении.конфигурации.Я хотел бы добавить новые сервисы в app.config и автоматически загружать их, не перекомпилируя мою программу и не используя мой кодированный вручную процесс для создания объектов ServiceHost.

Есть ли фабрика или учебное пособие, кто-то может связать меняпоказывает мне, как это сделать?Спасибо

1 Ответ

19 голосов
/ 18 сентября 2010

Я не уверен, что вы подразумеваете под извлечением связанных адресов и контрактов из конфигурации - это делается автоматически. Раздел службы в файле конфигурации автоматически сопоставляется с типом службы, размещенной в ServiceHost:

Сервис хостинга:

using (var host = new ServiceHost(typeof(MyNamespace.Service))
{
  // no endpoint setting needed if configuration is correctly paired by the type name
  host.Open() 
}

Сервисная конфигурация:

<services>
  <service name="MyNamespace.Service">
    ...
  </service>
</service>

Теперь единственное, что вам нужно, это автоматически обрабатывать создание ServiceHost. Вот мой пример кода, чтобы сделать это:

   class Program
   {
       static void Main(string[] args)
       {
           List<ServiceHost> hosts = new List<ServiceHost>();

           try
           {
               var section = ConfigurationManager.GetSection("system.serviceModel/services") as ServicesSection;
               if (section != null)
               {
                   foreach (ServiceElement element in section.Services)
                   {
                       var serviceType = Type.GetType(element.Name);
                       var host = new ServiceHost(serviceType);
                       hosts.Add(host);
                       host.Open();
                   }
               }

               Console.ReadLine();
           }
           catch (Exception e)
           {
               Console.WriteLine(e.Message);
               Console.ReadLine();
           }
           finally
           {
               foreach (ServiceHost host in hosts)
               {
                   if (host.State == CommunicationState.Opened)
                   {
                       host.Close();
                   }
                   else
                   {
                       host.Abort();
                   }
               }
           }
       }
   } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...