在同一进程中的多个Windows服务中托管WCF服务

时间:2010-12-29 19:10:07

标签: .net wcf appdomain self-hosting

我正在构建一个Windows服务来托管WCF服务,我正在使用:

var ServicesToRun = new ServiceBase[] 
            { new Service_1_Host() };
ServiceBase.Run(ServicesToRun);

我的问题是:

如果我的主机有第二个服务,我在上面的代码中添加了数组,如下所示:

var ServicesToRun = new ServiceBase[] { new Service_1_Host(), 
                                        new Service_2_Host() };
ServiceBase.Run(ServicesToRun);

第二个主机是否使用自己的应用程序域运行,或者我需要做一些配置才能让两个主机分别运行它分开的app域?

2 个答案:

答案 0 :(得分:3)

你接近这一切都错了......你需要分开:

  • Windows NT服务(源自ServiceBase),这只是为了昼夜不停地运行

  • 提供真实WCF服务接口的实际WCF服务主机(派生自ServiceHost)。

基本上,你需要做的是:

    NT服务中的
  • ServiceBase)有一个OnStart事件 - 在该事件中,您需要创建并打开您的WCF ServiceHost实例 - 每个WCF服务一个(实施)类

  • 在该NT服务(ServiceBase)中有一个OnStop事件,您应在其中关闭您的WCF服务主机

您的某些代码大致类似于:

using System;
using System.ServiceModel;

namespace YourNameSpace
{
    public class WcfHostService : ServiceBase
    {
        private ServiceHost _serviceHost1 = null;
        private ServiceHost _serviceHost2 = null;

        protected override void OnStart(string[] args)
        {
            // instantiate new ServiceHost instances 
            if (_serviceHost1 == null)
            {
                _serviceHost1 = new ServiceHost(typeof(YourService1));
            }

            if (_serviceHost2 == null)
            {
                _serviceHost2 = new ServiceHost(typeof(YourService2));
            }

            // open service hosts
            _serviceHost1.Open();
            _serviceHost2.Open();
        }

        protected override void OnStop()
        {
            if (_serviceHost1.State != CommunicationState.Closed)
            {
                _serviceHost1.Close();
            }

            if (_serviceHost2.State != CommunicationState.Closed)
            {
                _serviceHost2.Close();
            }
        }
    }
}

然后在您的NT服务主应用程序中,您将拥有:

var servicesToRun = new ServiceBase[] { new WcfHostService() };
ServiceBase.Run(servicesToRun);

这就是全部,真的!

答案 1 :(得分:2)

请注意,这是一个ServiceBase的数组,而不是HostsBase的数组。您只是启动多个Windows服务。这与WCF甚至与AppDomains无关。