zoukankan      html  css  js  c++  java
  • wcf中如何Host多个WCF服务?

         如果用self-host的方式来加载服务的话,我们一般是用这样的代码:ServiceHost host1 = new ServiceHost(typeof(UserService)); 问题是,如果当你的服务很多的时候这样做是不胜其烦的,今天在看Ingo Rammer(大名鼎鼎的《Advanced .Net Remoting》作者)的Blog的时候,看到了他解决这一问题的方法:
    一.服务配置在app.config或web.config中:

     1using System;
     2using System.Collections.Generic;
     3using System.Reflection;
     4using System.Configuration;
     5using System.ServiceModel.Configuration;
     6using System.ServiceModel;
     7
     8public class ServiceHostGroup
     9{
    10    static List<ServiceHost> _hosts = new List<ServiceHost>();
    11
    12    private static void OpenHost(Type t)
    13    {
    14        ServiceHost hst = new ServiceHost(t);
    15        hst.Open();
    16        _hosts.Add(hst);
    17    }

    18
    19    public static void StartAllConfiguredServices()
    20    {
    21        Configuration conf = 
    22          ConfigurationManager.OpenExeConfiguration(Assembly.GetEntryAssembly().Location);
    23
    24        ServiceModelSectionGroup svcmod = 
    25          (ServiceModelSectionGroup)conf.GetSectionGroup("system.serviceModel");
    26        foreach (ServiceElement el in svcmod.Services.Services)
    27        {
    28            Type svcType = Type.GetType(el.Name);
    29            if (svcType == null
    30              throw new Exception("Invalid Service Type " + el.Name + " in configuration file.");
    31            OpenHost(svcType);
    32        }

    33
    34    }

    35
    36
    37    public static void CloseAllServices()
    38    {
    39        foreach (ServiceHost hst in _hosts)
    40        {
    41            hst.Close();
    42        }

    43    }

    44}



    二.服务配置在外部配置文件中:

    Services.XML:

    <configuredServices>
      <service type="ServiceImplementation.ArticleService, ServiceImplementation" />
    </configuredServices>


    ServiceHostBase.cs:

     1using System;
     2using System.Collections.Generic;
     3using System.Reflection;
     4using System.Configuration;
     5using System.ServiceModel.Configuration;
     6using System.ServiceModel;
     7using System.Xml;
     8using System.Xml.Serialization;
     9using System.IO;
    10
    11public class ServiceHostGroup
    12{
    13  static List<ServiceHost> _hosts = new List<ServiceHost>();
    14
    15  private static void OpenHost(Type t)
    16  {
    17    ServiceHost hst = new ServiceHost(t);
    18    Type ty = hst.Description.ServiceType;
    19    hst.Open();
    20    _hosts.Add(hst);
    21  }

    22
    23  public static void StartAllConfiguredServices()
    24  {
    25    ConfiguredServices services = ConfiguredServices.LoadFromFile("services.xml");
    26
    27    foreach (ConfiguredService svc in services.Services)
    28    {
    29      Type svcType = Type.GetType(svc.Type);
    30      if (svcType == nullthrow new Exception("Invalid Service Type " + svc.Type + " in configuration file.");
    31      OpenHost(svcType);
    32    }

    33  }

    34
    35  public static void CloseAllServices()
    36  {
    37    foreach (ServiceHost hst in _hosts)
    38    {
    39      hst.Close();
    40    }

    41  }

    42}

    43
    44[XmlRoot("configuredServices")]
    45public class ConfiguredServices
    46{
    47  public static ConfiguredServices LoadFromFile(string filename)
    48  {
    49    if (!File.Exists(filename)) return new ConfiguredServices();
    50
    51    XmlSerializer ser = new XmlSerializer(typeof(ConfiguredServices));
    52    using (FileStream fs = File.OpenRead(filename))
    53    {
    54      return (ConfiguredServices) ser.Deserialize(fs);
    55    }

    56  }

    57
    58  [XmlElement("service"typeof(ConfiguredService))]
    59  public List<ConfiguredService> Services = new List<ConfiguredService>();
    60}

    61
    62public class ConfiguredService
    63{
    64  [XmlAttribute("type")]
    65  public string Type;
    66}



    原文:

    Start ServiceHosts for all configured Services 


  • 相关阅读:
    iOS证书的使用
    ios设备管理
    矩阵的相关问题(旋转矩阵&螺旋矩阵)
    flex实现多列布局效果&对角线布局
    peerdependencies
    数组和对象遍历方法对比
    async和defer
    Promise.all并发限制
    electron+react开发属于自己的桌面应用
    webpack代码切割
  • 原文地址:https://www.cnblogs.com/chuncn/p/1566077.html
Copyright © 2011-2022 走看看