なぜこんなことをするかというと単純にUWPやストアアプリで触れない部分を触るときに便利だからです。

 

とりあえずやってみる

簡潔にまとめると普通にSignalRサーバを建てる要領でOKです。

 

サービスの起動処理

using Microsoft.Owin;
using Microsoft.Owin.Hosting;
using System.ServiceProcess;

[assembly: OwinStartup(typeof(WindowsService1.Startup))]
namespace WindowsService1
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            string url = "http://localhost:8080";
            WebApp.Start(url);
        }

        protected override void OnStop()
        {
        }
    }
}

とりあえずOnStartメソッドでサーバをスタートさせればOK

 

Startupクラス

using Owin;
using Microsoft.Owin.Cors;

namespace WindowsService1
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(CorsOptions.AllowAll);
            app.MapSignalR();
        }
    }
}

これも普通にSelfHostする時のようにCorsの設定をしてMapSignalRを呼べばOK

 

Hubクラス

using Microsoft.AspNet.SignalR;

namespace WindowsService1
{
    public class SignalRHub : Hub
    {
        public void Send()
        {
            Clients.Caller.Receive("Received");
        }
    }
}

これも普通にHubクラスを書けばOK

 

このままだとサービスのインストールでこけるのでインストーラを追加します。

サービスを記述する.csファイルを開くとWindows Form的なデザイナが開くのでその画面で右クリックをすると以下のようにインストーラの追加という項目があるのでそれを選択します。

image

インストーラを追加すると以下のようになります。

image

 

サービスの起動

これでサービスの実装自体は完了です。

ですが、サービスはF5で開始できないのでコマンドを叩きます。

 

コマンドは、VSに付属するコマンドラインツールから実行します。

以下のコマンドをビルドしたバイナリのあるフォルダまで移動して叩きます。

installutil hoge.exe

 

アンインストールする場合は、以下のコマンドです。

installutil /u hoge.exe

 

インストールコマンドを実行するとタスクマネージャのサービスの項目にサービスを実装したクラスの名前でサービスが登録されます(デフォルトだとService1)

そのサービスを実行するとサーバが実行されます。

 

まとめ

サービスを修正したい場合は、再度インストールする必要はないので、一度サービスを止めてビルドしなおしてから再度実行してやれば変更が反映されます。

あとは、PCの起動時などに自動で実行されるようにスケジューラなどで管理してやるといい感じかと思います。

 

VSのExpress Editionだとサービスのテンプレートが含まれていなかった気がするのでその辺エディションには注意しましょう。

CATEGORIES