Domanda

Ho un applicazione WCF dispone di due Servizi, che sto cercando di ospitare in un unico Servizio di Windows utilizzando il net.tcp.Posso esecuzione di servizi, ma non appena provo a metterli entrambi in Servizio di Windows solo la prima carica.Ho deciso che secondo i servizi di un costruttore viene chiamato, ma OnStart non si attiva mai.Questo mi dice che WCF è trovare qualcosa di sbagliato con caricamento che secondo servizio.

Utilizzando il net.tcp so che ho bisogno di accendere la porta di condivisione e di avviare il servizio di condivisione porte sul server.Tutto questo sembra funzionare correttamente.Ho provato a mettere i servizi su diverse porte tcp e ancora senza successo.

Il mio servizio di classe installer assomiglia a questo:

 [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 servizi dall'aspetto molto simile

 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();
      }
}
È stato utile?

Soluzione

Di Base il servizio su questo Articolo di MSDN e creare due host del servizio.Ma invece di chiamare ogni host del servizio direttamente, si può rompere, sia come classi di come si desidera che definisce ogni servizio che si desidera eseguire:

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

Nel corpo di windows host del servizio, chiamare le varie classi:

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


    }

Quindi è possibile aggiungere come molti WCF servizi come un servizio di windows host.

RICORDATI di chiamare la fermata di metodi....

Altri suggerimenti

            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 si desidera un servizio di Windows per avviare due servizi WCF, avrete bisogno di una ServiceInstaller che ha due ServiceHost casi, entrambi i quali vengono avviati nell' (singolo) metodo OnStart.

Si potrebbe desiderare di seguire il modello per ServiceInstaller che nel codice del template quando si sceglie di creare un nuovo Servizio di Windows in Visual Studio - in generale, questo è un buon posto per iniziare.

probabilmente hai solo bisogno di 2 host del servizio.

_host1 e _host2.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top