しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET MVC と SignalR を組み合わせて使う

最近は Web API よりも SignalR で API を用意したほうが使い勝手がいいと思っているんですが、やはり SignalR だけでは完結できないことのが多いです。

なので、今回は ASP.NET MVC と SignalR を組み合わせて使う方法について書いていきます。

まず大前提として、SignalR は Web Forms や MVC に依存するコンポーネントではないことです。つまり Web Forms・MVC・Web API のどれとも組み合わせて使うことができます。

Install-Package SignalR

このコマンドを実行するだけで SignalR は使えるわけです。

しかし、SignalR の Hub や PersistentConnection は SignalR のランタイムによって自動的にアクティベートされるわけで、外部からインスタンスを取得することは非常に困難です。

// このクラスは SignalR が自動的にアクティベートする
public class SampleHub : Hub
{
}

SignalR の機能でもサーバ側で、さらに Hub や PersistentConnection の外部から使いたいものといえば、当然ながらクライアントへのプッシュですね。それに関しては SignalR は ConnectionManager を提供することで、外部から使用可能になっています。

public class HomeController : Controller
{
    public ActionResult PushHub()
    {
        // SampleHub の IHubContext を取得
        var context = GlobalHost.ConnectionManager.GetHubContext<SampleHub>();

        // クライアントのメソッドを呼び出す
        context.Clients.someMethod();
    }
}

PersistentConnection の場合は GetConnectionContext メソッドを使えば IPersistentConnectionContext を取得できるので、同様に実装が可能です。

これを使えば、例えば MVC アプリケーションのフォームでデータが登録された時に、SignalR を使ってその場で反映、といったようなことが出来るわけです。