1 つの Windows サービスで 2 つの WCF サービスをホストするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/54419

  •  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。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top