Как разместить 2 службы WCF в 1 службе Windows?
-
09-06-2019 - |
Вопрос
У меня есть приложение WCF с двумя службами, которые я пытаюсь разместить в одной службе Windows, используя net.tcp.Я могу нормально запустить любую из служб, но как только я пытаюсь поместить их обе в службу Windows, загружается только первая.Я определил, что вызывается второй сервисный сектор, но OnStart никогда не срабатывает.Это говорит мне о том, что WCF обнаружил что-то неправильное при загрузке второго сервиса.
Используя net.tcp, я знаю, что мне нужно включить совместное использование портов и запустить службу совместного использования портов на сервере.Кажется, все это работает правильно.Я пробовал разместить службы на разных портах TCP, но безуспешно.
Мой класс установщика службы выглядит следующим образом:
[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 });
}
}
и оба сервиса очень похожи
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();
}
}
Решение
Основывайте свой сервис на этом Статья MSDN и создайте два хоста службы.Но вместо того, чтобы напрямую вызывать каждый хост службы, вы можете разбить его на любое количество классов, определяющих каждую службу, которую вы хотите запустить:
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;
}
}
};
В теле хоста службы Windows вызовите различные классы:
// Start the Windows service.
protected override void OnStart( string[] args )
{
// Call all the set up WCF services...
MyWCFService1.StartService();
//MyWCFService2.StartService();
//MyWCFService3.StartService();
}
Затем вы можете добавить столько служб WCF, сколько захотите, на один узел службы Windows.
ПОМНИТЕ также вызывать методы остановки....
Другие советы
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!!!!!!!!!");
Если вы хотите, чтобы одна служба Windows запускала две службы WCF, вам понадобится один ServiceInstaller с двумя экземплярами ServiceHost, оба из которых запускаются (одним) методом OnStart.
Возможно, вы захотите следовать шаблону ServiceInstaller, который находится в коде шаблона, когда вы решите создать новую службу Windows в Visual Studio — в целом это хорошее место для начала.
вам, вероятно, просто нужны 2 сервисных хоста.
_хост1 и _хост2.