読者です 読者をやめる 読者になる 読者になる

しばやん雑記

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

SignalR 0.5.3 で変わった JavaScript クライアント

ASP.NET SignalR

こんばんは、最近はすっかり Windows Azure と SignalR で API 作ったり、iPhone アプリの開発ばっかりしてます。

それはさておき、SignalR 0.5.3 が公開されました。

Announcing the Release of SignalR 0.5.3 - .NET Web Development and Tools Blog - Site Home - MSDN Blogs

正式には ASP.NET の仲間入りをしていない SignalR が .NET Web Development and Tools Blog でアナウンスされるとは驚きです。てっきり 0.5.3 はバグ修正とか*1だと思っていたら、JavaScript のクライアントが大きく変更されていました。

わかりやすく説明するために 0.5.2 と 0.5.3 で同じ処理を書いてみます。

0.5.2

// chat ハブを取得
var chat = $.connection.chat;

// 接続開始
$.connection.hub.start(function() {
    // サーバ側メソッド呼び出し
    chat.addMessage("foo");

    // サーバから呼び出されるメソッドを登録
    chat.receiveMessage = function (text) {
        alert(text);
    };
});

0.5.3

// 接続を取得
var connection = $.hubConnection();

// chat ハブを取得
var chat = connection.createProxy("chat");

// 接続開始
connection.start(function() {
    // サーバ側メソッド呼び出し
    chat.invoke("AddMessage", "foo");

    // サーバから呼び出されるメソッドを登録
    chat.on("ReceiveMessage", function (text) {
        alert(text);
    });
});

パッと見では 0.5.3 よりも 0.5.2 のほうが書きやすそうに見えるかと思います。しかし 0.5.3 では自動生成される JavaScript の参照が必要なくなりました。

0.5.2

<script src="Scripts/jquery-1.8.0.min.js"></script>
<script src="Scripts/jquery.signalR-0.5.2.min.js"></script>
<!-- 実行時に自動生成されるプロキシを読み込む必要があった -->
<script src="SignalR/Hubs"></script>

0.5.3

<script src="Scripts/jquery-1.8.0.min.js"></script>
<script src="Scripts/jquery.signalR-0.5.3.min.js"></script>

それに伴って、全ての API でインテリセンスが動作するようになっています。さらに、この JavaScript のクライアントは .NET 向けの各種クライアントとほぼ同じ API となっています。

// 接続を作成
var connection = new HubConnection("http://localhost/");

// chat ハブを取得
var chat = connection.CreateProxy("chat");

// 接続開始
await connection.Start();

// サーバ側メソッド呼び出し
await chat.Invoke("AddMessage", "foo");

// サーバから呼び出されるメソッドを登録
chat.On<string>("ReceiveMessage", p => MessageBox.Show(p));

SignalR の殆どのメソッドは Task を返すようになっているので、ContinueWith や await を使うことで JavaScript 版とほぼ同じように書けます。

0.5.2 までは JavaScript API と .NET 向け API で別々になっていたのが統一されたのは歓迎すべきことだと思います。それ以外に関しては仕事しつつ検証していきたいと思います。

*1:そういえばメッセージバスのリライト版は 0.5.3 では入ってないみたい