はじめに
WCF サービスをセルフホストする場合、 Windows サービスを作ることになると思う。
本番環境で動かすときは Windows サービスでいいんだけど、 デバッグはコンソールアプリケーションの方が便利。 そのため、Windows サービスとコンソールアプリケーションのプロジェクトを両方作って保守している。 もちろんコードの大部分は共有しているが。
Topshelf 使えば手軽に Windows サービスを作れる上、 コンソールアプリケーションとしても実行できるらしい。 こいつを使えば2つのプロジェクトを保守する手間とオサラバできそうだ。 これは試してみる価値あるな。
Topshelf をインストール
Visual Studio の Package Manager Console で
> Install-Package Topshelf
を実行し、WCF サービスのプロジェクトに Topshelf をインストールする。
Topshelf を使って WCF サービスをセルフホスト
下記のようなサービスコントラクトとサービスクラスがあったとする。
namespace WcfSample.Common { using System.ServiceModel; [ServiceContract] public interface ISampleService { [OperationContract] string GetServerName(); } } namespace WcfSample.Service { using System; using WcfSample.Common; public class SampleService : ISampleService { public string GetServerName() { return Environment.MachineName; } } }
Topshelft を使えば、こんな感じで Windows サービス化できる。
namespace WcfSample.Service { using System.ServiceModel; using Topshelf; class Program { static void Main(string[] args) { HostFactory.Run(config => { config.Service<ServiceHost>(service => { // エンドポイントの設定はアプリケーション構成ファイルで行うことを想定しているので // ここでは設定していない。 service.ConstructUsing(settings => new ServiceHost(typeof(SampleService))); service.WhenStarted(host => host.Open()); service.WhenStopped(host => host.Close()); }); config.RunAsNetworkService(); config.SetDescription("WCF サンプルサービス"); config.SetDisplayName("WCF サンプルサービス"); config.SetServiceName("WcfSampleService"); }); } } }
コンソールアプリケーションとして実行
作成した exe を普通に実行するだけ。
> WcfSample.Service.exe
Windows サービスとしてインストール
install サブコマンドが使えるようになっているので、
> WcfSample.Service.exe install
で Windows サービスをインストールできる。
インストールしただけでは開始されていないので、 start サブコマンドを使って
> WcfSample.Service.exe start
で Windows サービスを開始してやる必要がある。
Windows サービスをアンインストール
uninstall サブコマンドも使える。 今回のサンプルなら
> WcfSample.Service.exe uninstall
でアンインストールできた。
おわりに
超簡単に WCF サービスを Windows サービスでホストできた。 この簡単さを経験した後だと、 もう Windows サービスのプロジェクトテンプレートを使いたいとは思えないな。 今まで仕方なく使っていたけど、もうやってられない。