2010-09-18 55 views
10

当我创建一个自托管的wcf应用程序时,我为每个想要公开的服务创建ServiceHost对象。然后它会查找app.config(匹配服务器名称),然后提取关联的端点地址和合同。WCF自托管应用程序可以使用app.config自动创建ServiceHosts吗?

是否有办法为app.config中列出的每个服务自动创建ServiceHosts。我想向app.config添加新的服务,并让它们自动加载,无需重新编译我的程序,并使用我手动编码的过程来创建ServiceHost对象。

有工厂或教程有人可以链接我,告诉我如何做到这一点? 谢谢

回答

19

我不知道你是什么意思从配置拉相关的地址和合同 - 这是自动完成。

服务托管:在配置文件中的服务部分自动在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(); 
        } 
       } 
      } 
     } 
    } 
+0

太棒了!那正是我失踪的那一块。我不确定如何遍历配置来实例化服务。对不起,我的问题太模糊了。我不太确定如何说出它。 – djmc 2010-09-18 10:58:38

相关问题