1 つの Windows サービスで 2 つの WCF サービスをホストするにはどうすればよいですか?
-
09-06-2019 - |
質問
net.tcp を使用して 1 つの Windows サービスでホストしようとしている 2 つのサービスを持つ WCF アプリケーションがあります。どちらのサービスも問題なく実行できますが、両方のサービスを Windows サービスに配置しようとすると、最初のサービスのみが読み込まれます。2 番目のサービス ctor が呼び出されていることがわかりましたが、OnStart は起動しません。これは、WCF が 2 番目のサービスのロードに問題があることを検出していることを示しています。
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 の記事 そして 2 つのサービス ホストを作成します。ただし、実際に各サービス ホストを直接呼び出す代わりに、実行する各サービスを定義する必要な数のクラスに分割できます。
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();
}
その後、1 つの Windows サービス ホストに好きなだけ WCF サービスを追加できます。
stop メソッドも忘れずに呼び出してください。
他のヒント
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!!!!!!!!!");
1 つの Windows サービスで 2 つの WCF サービスを開始する場合は、2 つの ServiceHost インスタンスを持つ 1 つの ServiceInstaller が必要になります。両方とも (単一の) OnStart メソッドで開始されます。
Visual Studio で新しい Windows サービスを作成することを選択する場合は、テンプレート コードにある ServiceInstaller のパターンに従うことをお勧めします。通常は、これが開始点として適しています。
おそらくサービス ホストは 2 つだけ必要です。
_host1 と _host2。