SignalR でお手軽サーバー Push

最近 SQLWorld の勉強会で SQL を書くハンズオンをやっていますが、そのサイトで SignalR/SignalR · GitHub を利用しています。今回はその実装の一部を紹介します。
どんなのかというと、参加者が書いたクエリを結果ページにどんどん送る箇所で利用しています。


まずは、結果ページの方から紹介します。

結果ページのスクリプト一部抜粋

<script src="/signalr/hubs"></script>
<script src="~/Scripts/App/ResultViewModel.js"></script>
<script type="text/javascript">
  $(function () {
    var hub = $.connection.queryNotify;

    hub.client.pushResult = function (json) {
      // ここでサーバーから push された内容を HTML に反映させる。
    };

    $.connection.hub.start().done(function () {
    });
  });
</script>

受け取る側の実装はこんだけですね。接続失敗や、接続切れ対応云々はしてません。
次は、Push するサーバー側の実装を。

Hubクラス /Hubs/QueryNotifyHub.cs の抜粋

using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace TSQLRunner.Web.Hubs {
  [HubName("queryNotify")]
  public class QueryNotifyHub : Hub {
  }
}

Hub クラスを使って、クライアントに Push する箇所の抜粋

public void Notify(string json) {
  var context = GlobalHost.ConnectionManager.GetHubContext<QueryNotifyHub>();
  context.Clients.All.pushResult(json);
}

サーバー側のコード少なっ!*1
Hub クラスは、Push するだけならメソッドの定義は不要です。
SignalR には、Hub 以外に Persistent Connections もありますが、今回は、パフォーマンス諸々別にどうでも良かったので、お手軽な Hub を利用しました。
SignalR の日本語記事は、特集:ASP.NET SignalR入門(後編):ASP.NET SignalRの高度な機能 (1/3) - @IT にリンクが色々載ってるのでお勧めです。


まだ告知ページまだ用意していませんが、次回の SQLWorld ハンズオンは、8/27(火) の予定です。興味を持った方は是非ご参加を〜。

*1:スタートアップのコードは省いてます。Application_Start で RouteTable.Routes.MapHubs(); 呼んでね。