C#でSignalRを使用した通信を行いたい その12(Windowsサービス②) | プログラミングがわからなすぎる

プログラミングがわからなすぎる

気が向いた時の備忘録。プログラミングは好きなのに物凄く単純なものしか理解できないからメモしていくうちに覚えられたらいいな
ターゲットフレームワークは大体4.7.2

準備は前記事を参照

 

今回はWindowsサービスで作るサーバ側プログラムの

ソースのメモをやっていきたいと思います

 

この人たちです(初期状態から変更なさそうな人はスルーします)

 

 

サンプルコード 

 Service1.cs

using System.Diagnostics;
using System.ServiceProcess;

namespace WindowsService1
{
    public partial class Service1 : ServiceBase
    {
        private SignalRHost server;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            // デバッグ用
            Debugger.Launch();

            server = SignalRHost.signalRHost;
            server.Start();

        }

        protected override void OnStop()
        {
            server?.Stop();
        }
    }
}

OnStartからデバッグでステップ実行とかしたい場合は

黄色マーカーの「Debugger.Launch();」を書きます

 

サービス起動であるOnStartでSignalRHostのStart()を呼び出し、

サービス停止であるOnStopでStop()を呼び出します

これでこのWindowsサービスが起動したときにサーバ側プログラムが開始されて

停止したときに止まるはず

 

OnShutdownも入れると本当はいいのかな?

 

 

 SignalRHost.cs

using Microsoft.Owin.Hosting;
using System;

namespace WindowsService1
{
    class SignalRHost
    {
        public static SignalRHost signalRHost = new SignalRHost();
        private IDisposable server;

        /// <summary>
        /// 開始
        /// </summary>
        public void Start()
        {
            server = WebApp.Start<Startup>("http://localhost:8088");
        }

        /// <summary>
        /// 停止
        /// </summary>
        public void Stop()
        {
            server?.Dispose();
        }
    }
}

このクラスは新規作成しました

使用する環境に合わせて赤字の部分を変更して使います

たぶん環境によって変更が必要なのは8088のポート番号の部分くらいのはず

 

 

 Startup.cs

using Microsoft.AspNet.SignalR;
using Owin;

namespace WindowsService1
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR(new HubConfiguration());
        }
    }
}

このクラスも新規作成しました

何しているのかは覚えてませんが

いつかコピペして使うかもしれないので残しておきます

 

 

 TestHub.cs

using Microsoft.AspNet.SignalR;
using System;

namespace WindowsService1
{
    public class TestHub : Hub
    {
        // TODO ここにクライアントから呼び出すメソッドを書く
    }
}

このクラスも新規作成しました

だいじなHubクラスです

クライアント側プログラムから呼び出したいメソッドとかを

TODOの部分に書いてた気がします

 

実行結果については、いつかまとめる③で記載します

実行するのに思ったより手間取った…