0

我正在构建一个 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);

第二台主机是否使用自己的应用程序域运行,或者我必须做一些配置才能使两台主机分别运行它单独的应用程序域?

4

2 回答 2

3

你接近这一切都错了......你需要保持距离:

  • Windows NT 服务(派生自ServiceBase),它只是在这里全天候运行

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

基本上,您需要做的是:

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

  • 在那个 NT Service ( 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 Service 主应用程序中,您将拥有:

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

就是这样,真的!

于 2010-12-29T19:34:24.640 回答
2

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

于 2010-12-29T19:14:54.787 回答