Pergunta

Eu tenho um aplicativo WCF que possui dois serviços que estou tentando hospedar em um único serviço do Windows usando net.tcp.Posso executar qualquer um dos serviços perfeitamente, mas assim que tento colocar os dois no serviço do Windows, apenas o primeiro é carregado.Eu determinei que o segundo setor de serviços está sendo chamado, mas o OnStart nunca é acionado.Isso me diz que o WCF está encontrando algo errado ao carregar esse segundo serviço.

Usando net.tcp, sei que preciso ativar o compartilhamento de porta e iniciar o serviço de compartilhamento de porta no servidor.Tudo isso parece estar funcionando corretamente.Tentei colocar os serviços em diferentes portas TCP e ainda sem sucesso.

Minha classe de instalador de serviço é assim:

 [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 });
      }   
}

e ambos os serviços parecem muito semelhantes

 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();
      }
}
Foi útil?

Solução

Baseie seu serviço nisso Artigo MSDN e crie dois hosts de serviço.Mas, em vez de chamar cada host de serviço diretamente, você pode dividi-lo em quantas classes desejar, o que define cada serviço que você deseja executar:

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;
        }
    }
};

No corpo do host de serviço do Windows, chame as diferentes classes:

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


    }

Em seguida, você pode adicionar quantos serviços WCF desejar a um host de serviço do Windows.

LEMBRE-SE de chamar os métodos stop também....

Outras dicas

            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!!!!!!!!!");

Se quiser que um serviço do Windows inicie dois serviços WCF, você precisará de um ServiceInstaller que tenha duas instâncias de ServiceHost, ambas iniciadas no método OnStart (único).

Talvez você queira seguir o padrão do ServiceInstaller que está no código do modelo ao optar por criar um novo serviço do Windows no Visual Studio - em geral, esse é um bom lugar para começar.

você provavelmente só precisa de 2 hosts de serviço.

_host1 e _host2.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top