よく考えたら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って素晴らしい