Frage

Ich habe eine WCF-Anwendung mit zwei Diensten, die ich mithilfe von net.tcp in einem einzigen Windows-Dienst hosten möchte.Ich kann jeden der Dienste problemlos ausführen, aber sobald ich versuche, beide in den Windows-Dienst aufzunehmen, wird nur der erste geladen.Ich habe festgestellt, dass der zweite Dienstprozessor aufgerufen wird, OnStart jedoch nie ausgelöst wird.Das sagt mir, dass WCF beim Laden dieses zweiten Dienstes einen Fehler findet.

Wenn ich net.tcp verwende, weiß ich, dass ich die Portfreigabe aktivieren und den Portfreigabedienst auf dem Server starten muss.Das scheint alles richtig zu funktionieren.Ich habe versucht, die Dienste auf verschiedene TCP-Ports zu legen, aber immer noch ohne Erfolg.

Meine Service-Installer-Klasse sieht folgendermaßen aus:

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

und beide Dienste sehen sehr ähnlich aus

 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();
      }
}
War es hilfreich?

Lösung

Basis Ihren Dienst auf diesem MSDN-Artikel und erstellen Sie zwei Service Gastgeber. Aber anstatt tatsächlich direkt jeden Service-Host anrufen, können Sie es brechen, um so viele Klassen, wie Sie wollen, die jeden Dienst definiert die Sie ausführen möchten:

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

Im Körper des Windows-Service-Host, rufen Sie die verschiedenen Klassen:

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


    }

Dann können Sie fügen Sie so viele WCF-Dienste, wie Sie möchten, um ein Windows-Dienst-Host.

remeber als auch die Anschlag Methoden aufrufen ....

Andere Tipps

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

Wenn Sie einen Windows-Dienst wollen zwei WCF-Dienste zu starten, werden Sie einen Serviceinstaller benötigen, die zwei Servicehost Instanzen haben, die beide in der (einzigen) OnStart Methode gestartet werden.

Sie können das Muster für Serviceinstaller folgen wollen, die in dem Template-Code ist, wenn Sie einen neuen Windows-Dienst in Visual Studio erstellen wählen -. Im Allgemeinen dies ein guter Ort, um zu starten

Sie wahrscheinlich brauchen nur zwei Service-Hosts.

_host1 und _host2.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top