2008-09-10 5 views
8

Ich habe eine WCF-Anwendung, die zwei Dienste hat, die ich in einem einzigen Windows-Dienst mit net.tcp hosten möchte. Ich kann einen der Dienste problemlos ausführen, aber sobald ich versuche, beide in den Windows-Dienst zu stellen, wird nur der erste geladen. Ich habe festgestellt, dass der zweite Dienst ctor aufgerufen wird, aber der OnStart wird nie ausgelöst. Das zeigt mir, dass WCF etwas falsch mit dem Laden dieses zweiten Dienstes findet.Wie 2 WCF-Dienste in 1 Windows-Dienst hosten?

Mit net.tcp Ich weiß, ich muss Port-Sharing aktivieren und den Port-Sharing-Dienst auf dem Server starten. Das scheint alles richtig zu funktionieren. Ich habe versucht, die Dienste auf verschiedenen TCP-Ports und immer noch keinen Erfolg.

Mein Service Installer-Klasse sieht wie folgt 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 suchen sehr ähnlich

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

Antwort

11

Basieren Sie Ihren Dienst auf dieser MSDN article und erstellen Sie zwei Service-Hosts. Aber anstatt wirklich jeden Dienst Host direkt aufrufen, 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 verschiedene 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 so viele WCF-Dienste hinzufügen, wie Sie zu einem Windows-Dienst-Host mögen.

remeber die Stopp-Methoden sowie zu nennen ....

+0

Das funktioniert! Ganz im Gegensatz zu ServiceBase.Run (ServiceBase []), wie die Microsoft-Vorlage impliziert, würde funktionieren ... Danke, du hast gerade meinen Tag gerettet! – DaveN59

0

Sie wahrscheinlich nur zwei Service-Hosts müssen.

_host1 und _host2.

+0

Ja, ich zeige nicht den anderen Dienst. Es erstellt einen eigenen Host wie den gezeigten. –

1

Wenn ein Windows-Dienst zwei WCF-Dienste starten soll, benötigen Sie einen ServiceInstaller mit zwei ServiceHost-Instanzen, die beide in der (einzelnen) OnStart-Methode gestartet werden.

Sie können dem Muster für ServiceInstaller folgen, das sich im Vorlagencode befindet, wenn Sie einen neuen Windows-Dienst in Visual Studio erstellen möchten - im Allgemeinen ist dies ein guter Ausgangspunkt.

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