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