在单个Windows服务中托管数十个WCF服务的正确方法是什么?

本文关键字:服务 WCF 十个 方法 是什么 Windows 单个 | 更新日期: 2023-09-27 18:13:53

我的任务是将几十个WCF服务转移到一个Windows服务上。我使用Windows服务模板创建了一个Windows服务,并将以下代码添加到ServiceHostController:

public partial class ServiceHostController : ServiceBase
{
    private List<ServiceHost> serviceHosts;
    public ServiceHostController()
    {
        InitializeComponent();
        this.ServiceName = "WCFServices";
        this.CanStop = true;
        this.AutoLog = true;
    }
    protected override void OnStart(string[] args)
    {
        if (serviceHosts != null)
        {
            foreach (var service in serviceHosts)
            {
                service.Close();
            }
        }
        InitializeServices();
        foreach (var service in serviceHosts)
        {
            service.Open();
        }
    }
    protected override void OnStop()
    {
        if (serviceHosts != null)
        {
            foreach (var service in serviceHosts)
            {
                service.Close();
            }
            serviceHosts.Close(); = null;
        }
        foreach (var service in serviceHosts)
        {
            service.Close();
        }
    }
    private void InitializeServices()
    {
        serviceHosts = new List<ServiceHost>()
        {
            new ServiceHost(typeof(WCFService1)),
            new ServiceHost(typeof(WCFService2)),
            // add dozens of services here
        };
    }
}

除了不遵循此处的"不要重复自己"规则(实际代码不同),我应该如何在Windows服务代码中托管这些WCF服务?

在单个Windows服务中托管数十个WCF服务的正确方法是什么?

Hans,你做的都对,但是我要替换你的InitializeServices();使用以下代码。这是伪代码,所以你需要替换比特:)

1)在app.config

中配置端点

2)从服务项目'程序集中获取服务类型

  Dictionary<Type, Type> mappings = new Dictionary<Type,Type>();
   foreach (Type t in MyServiceAssembly.GetTypes())
  {
    if (t.GetInterfaces().Length > 0)
    {
      foreach (Type ti in t.GetInterfaces())
        {
          if (mapping.ContainsKey(ti))
            System.Diagnostics.Debug.WriteLine("Class {0} implements more than one interface {1}", t.FullName, ti.FullName);
          else
            mapping.Add(ti, t);
          // System.Diagnostics.Debug.WriteLine("Class {0} implements {1}", t.FullName, ti.FullName);
        }
    }
  }

4) 如果你想从app.config控制端点,现在迭代你的端点并获得相应的服务实现,然后创建你的主机

//在你的服务启动中读取你的端点

 List<ServiceHost> serviceHosts = new List<ServiceHost>();
     ServicesSection servicesSection = (ServicesSection)WebConfigurationManager.GetSection("system.serviceModel/services");  
    for(int i = 0;i<servicesSection.Services.Count;i++)
    {
    ServiceEndpointElement endpoint = servicesSection.Services[i].Endpoints[0];  
    string url = string.Format("net.tcp://{0}:{1}/YouNameSpace_service_Name_From_EndPoint/{2}.svc","YourHost","YourPort");
      ServiceHost serviceHost = new ServiceHost(mappings[endpoint.Contract] , new Uri(url));
              serviceHost.Open();
              mServiceHosts.Add(serviceHost);
    }

5) 如果你不想从app.config中控制端点,那么迭代你的映射列表。

//在服务启动时执行

 List<ServiceHost> serviceHosts = new List<ServiceHost>();
     foreach(type t in mappings.Keys)
    {
            string url = string.Format("net.tcp://{0}:{1}/YouNameSpace_{2}.svc","YourHost","YourPort",t.name);
      ServiceHost serviceHost = new ServiceHost(mappings[t] , new Uri(url));
              serviceHost.Open();
              mServiceHosts.Add(serviceHost);
    }