リアルタイムWebを極める

第4回 SignalRの概要とアプリケーション開発の準備

この記事を読むのに必要な時間:およそ 2 分

第2回第3回はNode.jsとsocket.ioを中心に説明を行いましたが,今回からはMicrosoft発のASP.NET SignalRについて説明を行っていきたいと思います。

SignalRの概要

ASP.NET SignalRはASP.NET上に構築されたNode.jsとsocket.ioの組み合わせのように,接続を常に維持して通信するアプリケーションを開発するためのライブラリです。基本的にはWindows ServerとIISの組み合わせで動作しますが,最近ではMonoとApacheの組み合わせでも動作可能なように開発が進められています。

元々はASP.NET開発チームのDavid Fowler氏とDamian Edwards氏の個人プロジェクトでしたが,次回のアップデートで公式にASP.NET入りが決定しています。

 ASP.NETファミリー入りを果たしたSignalR

図 ASP.NETファミリー入りを果たしたSignalR

今までにASP.NETアプリケーションの開発経験がない方だとパフォーマンスで不安を持つ方もいるかもしれませんが,ASP.NET 4.5(.NET Framework 4.5上で動作するASP.NET)では非同期処理が全体的に取り入れられていますし,ASP.NETを動作させているIISはクライアントとの常時接続が必要となるリアルタイムWebアプリケーションを効率よく動作させるための仕組みが用意されているため,非常に効率的な通信を行えるようになっています。

SignalRの特徴

最大の特徴は,SignalRは実質WebSocketやHTTP上で動作するRPC(リモートプロシージャコール)な実装になっている点です。クライアントからはサーバに用意されたメソッドを呼び出す感覚で,サーバ側のAPIを実行することができるようになっています。

SignalRでクライアントからサーバのAPIを呼び出すサンプル

<script type="text/javascript">
    $(function() {
        var connection = $.hubConnection();
        var sample = connection.createHubProxy("sample");

        connection.start(function () {
            sample.invoke("Say", "Hello, world");
        });
    })
</script>

SignalRではクライアントから呼び出し可能なメソッドの集合をハブと呼んでいます。クライアントではハブのプロキシオブジェクトを作成して,メソッドを呼び出すという形をとっています。

SignalRのAPIはメソッド呼び出しなので,戻り値を取ることができます。しかし,通信は非同期で行われているため,戻り値はjQueryに用意されているDeferredオブジェクトを使って取得します。

Sayメソッドの戻り値を受け取り,表示するサンプル

<script type="text/javascript">
    $(function() {
        var connection = $.hubConnection();
        var sample = connection.createHubProxy("sample");

        connection.start(function () {
            sample.invoke("Say", "Hello, world").done(function(result) {
                alert(result);
            });
        });
    })
</script>

invokeメソッドはDeferredオブジェクトを返しますので,成功した時に呼び出される関数をdoneメソッドで登録します。これだけでメソッド呼び出しの戻り値を取得することができます。

ブラウザ以外からのアクセス

SignalRではJavaScriptから使えるクライアント以外にも,Windowsストアアプリや今までの.NET FrameworkアプリケーションからAPIを使うためのクライアントライブラリが公式に公開されていますし,コミュニティによる開発ですがiPhoneやMacアプリケーションから使うためのObjective-C版のクライアントライブラリも用意されています。

WindowsアプリケーションからSignalRのAPIを使うサンプル

class Program
{
    static void Main(string[] args)
    {
        Start();
    }

    private static async void Start()
    {
        var connection = new HubConnection("http://example.com/signalr");
        var sample = connection.CreateHubProxy("sample");

        await connection.Start();

        var result = await sample.Invoke<string>("Say", "Hello, world");

        Console.WriteLine(result);
    }
}

クライアントのAPIはJavaScript版と殆ど変っていないので,スマートフォン向けにネイティブアプリケーションを開発することになったとしても,APIを別途用意する必要もなく短期間での開発が可能になります。

Visual Studioを利用した開発

開発はもちろんVisual Studioを使って行います。最新のVisual Studio 2012にはWebSocketにも対応したIIS Expressと呼ばれる開発用のサーバも用意されていますので,SignalRとWebSocketの組み合わせで実際に開発したアプリケーションをローカル環境で動作させることができます。

Visual Studio自体は有料のバージョンだけではなく,無料で配布されているExpressバージョンを使ってSignalRアプリケーションの開発を行うことができます。

 「ダウンロード」から無償でダウンロードが可能

図 「ダウンロード」から無償でダウンロードが可能

Visual Studio Express 2012 for Webのダウンロード
http://www.microsoft.com/visualstudio/jpn/products/visual-studio-express-for-web

開発に必要なソフトウェアはすべて含まれているので,インストールが完了したらすぐにSignalRを利用した開発を始めることができます。

それでは次回は実際にSignalRを使ったアプリケーションを開発し,Windows Azure Webサイト上へデプロイを行いたいと思います。

著者プロフィール

芝村達郎(しばむらたつろう)

PHPでの受託開発が中心の会社に勤めていたが,趣味で C# や ASP.NET 開発を行う。

2010年4月から Microsoft MVP - ASP.NET/IIS を受賞。
2012年6月にソーシャルグリッド株式会社 取締役に就任。

blog:http://shiba-yan.hatenablog.jp/
twitter:@shibayan

コメント

コメントの記入