Как разместить 2 службы WCF в 1 службе Windows? - PullRequest
8 голосов
/ 10 сентября 2008

У меня есть приложение WCF, в котором есть две службы, которые я пытаюсь разместить в одной службе Windows, используя net.tcp. Я могу нормально запустить любую из служб, но как только я пытаюсь поместить их в службу 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();
      }
}

Ответы [ 4 ]

11 голосов
/ 18 сентября 2008

Основывайте свою службу на этой статье MSDN и создайте два хоста службы. Но вместо того, чтобы фактически вызывать каждый узел службы напрямую, вы можете разбить его на столько классов, сколько хотите, которые определяют каждую службу, которую вы хотите запустить:

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.

ПОМНИТЕ также вызывать методы stop ....

2 голосов
/ 06 февраля 2012
            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!!!!!!!!!");
1 голос
/ 17 сентября 2008

Если вы хотите, чтобы одна служба Windows запускала две службы WCF, вам понадобится один ServiceInstaller с двумя экземплярами ServiceHost, оба из которых запускаются в (одном) методе OnStart.

Возможно, вы захотите следовать шаблону для ServiceInstaller, который содержится в коде шаблона, когда вы решаете создать новую службу Windows в Visual Studio - в общем, это хорошее место для начала.

0 голосов
/ 10 сентября 2008

вам, вероятно, просто нужно 2 служебных хоста.

_host1 и _host2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...