最近 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(); 呼んでね。