ごった煮

色々な事を書いてます

SignalRをセルフホストする

よく考えたらSignalRをセルフホストする話題について何も触れてこなかった & ちょうどセルフホストしてどうのこうのする案件に触れたので, 簡単にまとめます.

基本は, ASP.NETを使ってホストする方法と大差ありません.

以下ソースコードです.

Startupクラス

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

Hubクラス

[HubName("SignalRHub")]
    class SignalRHub : Hub
    {
        public void Send()
        {
            Clients.Caller.Receive("Receive");
        }
    }

サーバインスタンスの生成とか停止とかをラップしたクラス

class SelfHostServer
    {
        private IDisposable server;
        public void Start()
        {
            server = WebApp.Start("http://localhost:8080/");
            Console.WriteLine("START Server");
        }

        public void Stop()
        {
            server.Dispose();
        }
    }

メインメソッドを呼び出すクラス

class Program
    {
        static SignalR.SelfHostServer host = new SignalR.SelfHostServer();
        static void Main(string[] args)
        {
            host.Start();

            Console.WriteLine("何かキーを押すと終了");
            Console.ReadKey();

            host.Stop();
        }
    }

これだけ書けば, とりあえずhttp://localhost:8080/にサーバ建つので, クライアントのコードからhttp://localhost:8080/signalrに接続を試みると接続できるはずです.

ここで, 毎度引っかかるポイントとして, Hubを継承したクラスを配置する場所は, 新たにHubsというフォルダを作ってその中に配置します. Hubsフォルダか, メインメソッドを呼び出すprogram.csの中にインナークラスとして書く以外で実行しようとするとHubが読み込めなくて落ちるので, ここだけ気を付けましょう.

クライアントのコードについては, 以前の記事を参照していただけると良いかと

それにしてもOWINって素晴らしい