【问题标题】:How to host 2 WCF services in 1 Windows Service?如何在 1 个 Windows 服务中托管 2 个 WCF 服务?
【发布时间】:2008-09-10 15:33:23
【问题描述】:

我有一个 WCF 应用程序,它有两个服务,我尝试使用 net.tcp 在单个 Windows 服务中托管。我可以很好地运行任何一个服务,但是一旦我尝试将它们都放在 Windows 服务中,只会加载第一个服务。我已确定正在调用第二个服务 ctor,但 OnStart 永远不会触发。这告诉我 WCF 在加载第二个服务时发现了问题。

使用 net.tcp 我知道我需要打开端口共享并在服务器上启动端口共享服务。这一切似乎工作正常。我尝试将服务放在不同的 tcp 端口上,但仍然没有成功。

我的服务安装程序类如下所示:

 [RunInstaller(true)]
 public class ProjectInstaller : Installer
 {
      private ServiceProcessInstaller _process;
      private ServiceInstaller        _serviceAdmin;
      private ServiceInstaller        _servicePrint;

      public ProjectInstaller()
      {
            _process = new ServiceProcessInstaller();
            _process.Account = ServiceAccount.LocalSystem;

            _servicePrint = new ServiceInstaller();
            _servicePrint.ServiceName = "PrintingService";
            _servicePrint.StartType = ServiceStartMode.Automatic;

            _serviceAdmin = new ServiceInstaller();
            _serviceAdmin.ServiceName = "PrintingAdminService";
            _serviceAdmin.StartType = ServiceStartMode.Automatic;

            Installers.AddRange(new Installer[] { _process, _servicePrint, _serviceAdmin });
      }   
}

这两种服务看起来非常相似

 class PrintService : ServiceBase
 {

      public ServiceHost _host = null;

      public PrintService()
      {
            ServiceName = "PCTSPrintingService";
            CanStop = true;
            AutoLog = true;

      }

      protected override void OnStart(string[] args)
      {
            if (_host != null) _host.Close();

            _host = new ServiceHost(typeof(Printing.ServiceImplementation.PrintingService));
            _host.Faulted += host_Faulted;

            _host.Open();
      }
}

【问题讨论】:

    标签: wcf windows-services


    【解决方案1】:

    将您的服务基于此MSDN article 并创建两个服务主机。 但是,您可以将其分解为任意数量的类,而不是直接调用每个服务主机,这些类定义了您要运行的每个服务:

    internal class MyWCFService1
    {
        internal static System.ServiceModel.ServiceHost serviceHost = null;
    
        internal static void StartService()
        {
            if (serviceHost != null)
            {
                serviceHost.Close();
            }
    
            // Instantiate new ServiceHost.
            serviceHost = new System.ServiceModel.ServiceHost(typeof(MyService1));
            // Open myServiceHost.
            serviceHost.Open();
        }
    
        internal static void StopService()
        {
            if (serviceHost != null)
            {
                serviceHost.Close();
                serviceHost = null;
            }
        }
    };
    

    在windows服务宿主体内,调用不同的类:

        // Start the Windows service.
        protected override void OnStart( string[] args )
        {
            // Call all the set up WCF services...
            MyWCFService1.StartService();
            //MyWCFService2.StartService();
            //MyWCFService3.StartService();
    
    
        }
    

    然后,您可以将任意数量的 WCF 服务添加到一个 Windows 服务主机。

    记住也要调用停止方法....

    【讨论】:

    • 这行得通!与 ServiceBase.Run(ServiceBase[]) 完全不同,正如 Microsoft 模板所暗示的那样,它可以工作......谢谢,你拯救了我的一天!
    【解决方案2】:
                Type serviceAServiceType = typeof(AfwConfigure);
                Type serviceAContractType = typeof(IAfwConfigure);
    
                Type serviceBServiceType = typeof(ConfigurationConsole);
                Type serviceBContractType = typeof(IConfigurationConsole);
    
                Type serviceCServiceType = typeof(ConfigurationAgent);
                Type serviceCContractType = typeof(IConfigurationAgent);
    
                ServiceHost serviceAHost = new ServiceHost(serviceAServiceType);
                ServiceHost serviceBHost = new ServiceHost(serviceBServiceType);
                ServiceHost serviceCHost = new ServiceHost(serviceCServiceType);
                Debug.WriteLine("Enter1");
                serviceAHost.Open();
                Debug.WriteLine("Enter2");
                serviceBHost.Open();
                Debug.WriteLine("Enter3");
                serviceCHost.Open();
                Debug.WriteLine("Opened!!!!!!!!!");
    

    【讨论】:

      【解决方案3】:

      如果您希望一个 Windows 服务启动两个 WCF 服务,您将需要一个具有两个 ServiceHost 实例的 ServiceInstaller,这两个实例都在(单个)OnStart 方法中启动。

      当您选择在 Visual Studio 中创建新的 Windows 服务时,您可能希望遵循模板代码中的 ServiceInstaller 模式 - 通常这是一个很好的起点。

      【讨论】:

        【解决方案4】:

        您可能只需要 2 个服务主机。

        _host1 和 _host2。

        【讨论】:

        • 是的,我没有显示其他服务。它会创建自己的主机,如图所示。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 1970-01-01
        • 2012-01-13
        相关资源
        最近更新 更多