我正在构建一个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域?
答案 0 :(得分:3)
你接近这一切都错了......你需要分开:
Windows NT服务(源自ServiceBase
),这只是为了昼夜不停地运行
提供真实WCF服务接口的实际WCF服务主机(派生自ServiceHost
)。
基本上,你需要做的是:
(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无关。