SignalR Self-Host

ASP .NET SignalRというだけあって、IIS上で動くASP.NETの一部だと思い込んでいたらこれはちょっと違う。
IIS上と限定せずに、普通のWindowsサービスとかの上で動きます。

f:id:orzmakoto:20150202224048p:plain

便利

どんなことができるかというと、今までは、TCPとかWCFで接続していたとこにSignalRが使えます。

SignalR Self-Host

そしてやってみよう。やはり日本語がない。まぁ英語サイトでも簡単なんでわかるけど。

【準備するもの】

  • .NET4.5のコンソールアプリケーションプロジェクト

【使用するパッケージ】

【手順概要】

  1. パッケージインストール
  2. SelfHostサーバー作成

パッケージインストール

PM> Install-Package Microsoft.AspNet.SignalR.SelfHost -Version 2.2.0
PM> Install-Package Microsoft.Owin.Cors

SelfHostサーバー作成

なんとこれだけ、たった20行!

using System;
using Owin;
using Microsoft.Owin.Hosting;
using Microsoft.Owin.Cors;
 
public class SignalrHostServer
{
    private IDisposable server;
 
    public void Start()
    {
        server = WebApp.Start<Startup>("http://localhost:9000/signalr/");
        Console.WriteLine("START SignalrHostServer ");
    }
    public void Stop()
    {
        server.Dispose();
    }
    private class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(CorsOptions.AllowAll);
            app.MapSignalR();
        }
    }
 
    [HubName("sampleHub")]
    public class SampleHub : Hub
    {
        static int valueCount;
 
        public void GetValue()
        {
            valueCount += 1;
            base.Clients.All.onUpdate(valueCount);
        }
 
    }
}

server = WebApp.Start<Startup>("http://localhost:9000/signalr/");

待ち受けIPとポートは任意のものに変えてください。
アドレス末尾の”signalr/”は任意の文字列でOKです。

app.UseCors(CorsOptions.AllowAll);

クロスドメイン接続のサポートを有効にします。
通常は、セキュリティ的にNGとなっているクロスドメイン接続ですがそれを回避するためにCROS(JSONPもありますがいつ、新しいブラウザがサポートしなくなるかわからない状況)を使用します。
クロスドメイン接続をサポートしない場合には、 ”Microsoft.Owin.Cors.3.0.0”のパッケージは不要です。

ではサーバーを起動しましょう。

using System;
class Program
{
    static SignalrHostServer host = new SignalrHostServer();
    static void Main(string[] args)
    {
        host.Start();
 
        Console.WriteLine("何かキーを押すと終了します。");
        Console.ReadKey();
 
        host.Stop();
    }
}

(∩´∀`)∩ワーイ

これで、サーバーとクライアントの通信も簡単簡単
しかも、デスクトップアプリとWebアプリの両方を対象にできるっていいじゃない。