WCF サービスを Topshelf で Windows サービス化

はじめに

WCF サービスをセルフホストする場合、 Windows サービスを作ることになると思う。

本番環境で動かすときは Windows サービスでいいんだけど、 デバッグはコンソールアプリケーションの方が便利。 そのため、Windows サービスとコンソールアプリケーションのプロジェクトを両方作って保守している。 もちろんコードの大部分は共有しているが。

Topshelf 使えば手軽に Windows サービスを作れる上、 コンソールアプリケーションとしても実行できるらしい。 こいつを使えば2つのプロジェクトを保守する手間とオサラバできそうだ。 これは試してみる価値あるな。

github.com

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 サービスのプロジェクトテンプレートを使いたいとは思えないな。 今まで仕方なく使っていたけど、もうやってられない。