Wie hoste ich zwei WCF-Dienste in einem Windows-Dienst?
-
09-06-2019 - |
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();
}
}
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.