チュートリアル: SignalR 1.x の概要

作成者: Patrick FletcherTim Teebken

警告

このドキュメントは、SignalR の最新バージョン用ではありません。 SignalR の ASP.NET Coreを見てみましょう。

このチュートリアルでは、SignalR を使用してリアルタイムのチャット アプリケーションを作成する方法を示します。 SignalR を空の ASP.NET Web アプリケーションに追加し、メッセージを送信および表示する HTML ページを作成します。

概要

このチュートリアルでは、簡単なブラウザー ベースのチャット アプリケーションを構築する方法を示して、SignalR 開発について説明します。 SignalR ライブラリを空の ASP.NET Web アプリケーションに追加し、クライアントにメッセージを送信するためのハブ クラスを作成し、ユーザーがチャット メッセージを送受信できるようにする HTML ページを作成します。 MVC ビューを使用して MVC 4 でチャット アプリケーションを作成する方法を示す同様のチュートリアルについては、「SignalR と MVC 4 を使用したはじめに」を参照してください。

Note

このチュートリアルでは、SignalR のリリース (1.x) バージョンを使用します。 SignalR 1.x と 2.0 の間の変更の詳細については、「 SignalR 1.x プロジェクトのアップグレード」を参照してください。

SignalR は、ライブ ユーザー操作またはリアルタイムデータ更新を必要とする Web アプリケーションを構築するためのオープンソースの .NET ライブラリです。 たとえば、ソーシャル アプリケーション、マルチユーザー ゲーム、ビジネス コラボレーション、ニュース、天気、財務更新アプリケーションなどがあります。 これらは、多くの場合、リアルタイム アプリケーションと呼ばれます。

SignalR を使用すると、リアルタイム アプリケーションを構築するプロセスが簡略化されます。 これには、ASP.NET サーバー ライブラリと JavaScript クライアント ライブラリが含まれており、クライアントとサーバーの接続の管理とクライアントへのコンテンツ更新のプッシュを容易にします。 SignalR ライブラリを既存の ASP.NET アプリケーションに追加して、リアルタイム機能を利用できます。

このチュートリアルでは、次の SignalR 開発タスクについて説明します。

  • ASP.NET Web アプリケーションへの SignalR ライブラリの追加。
  • クライアントにコンテンツをプッシュするハブ クラスの作成。
  • Web ページで SignalR jQuery ライブラリを使用して、ハブからメッセージを送信し、更新プログラムを表示します。

次のスクリーン ショットは、ブラウザーで実行されているチャット アプリケーションを示しています。 新しい各ユーザーは、コメントを投稿し、ユーザーがチャットに参加した後に追加されたコメントを表示できます。

チャット インスタンス

セクション:

プロジェクトをセットアップする

このセクションでは、空の ASP.NET Web アプリケーションを作成し、SignalR を追加し、チャット アプリケーションを作成する方法について説明します。

前提条件:

  • Visual Studio 2010 SP1 または 2012。 Visual Studio をお持ちでない場合は、「 ASP.NET ダウンロード 」を参照して、無料の Visual Studio 2012 Express Development Tool を入手してください。
  • Microsoft ASP.NET and Web Tools 2012.2. Visual Studio 2012 の場合、このインストーラーは SignalR テンプレートを含む新しい ASP.NET 機能を Visual Studio に追加します。 Visual Studio 2010 SP1 の場合、インストーラーは使用できませんが、セットアップ手順の説明に従って SignalR NuGet パッケージをインストールすることでチュートリアルを完了できます。

次の手順では、Visual Studio 2012 を使用して ASP.NET 空の Web アプリケーションを作成し、SignalR ライブラリを追加します。

  1. Visual Studio で、ASP.NET 空の Web アプリケーションを作成します。

    空の Web を作成する

  2. [ツール] を選択して パッケージ マネージャー コンソール を開く |NuGet パッケージ マネージャー |パッケージ マネージャー コンソール。 コンソール ウィンドウに次のコマンドを入力します。

    Install-Package Microsoft.AspNet.SignalR -Version 1.1.3

    このコマンドは、SignalR 1.x の最新バージョンをインストールします。

  3. ソリューション エクスプローラーで、プロジェクトを右クリックし、追加 |クラス。 新しいクラスに ChatHub という名前を付けます。

  4. [ソリューション エクスプローラースクリプト] ノードを展開します。 jQuery と SignalR のスクリプト ライブラリがプロジェクトに表示されます。

    ライブラリ参照

  5. ChatHub クラスのコードを次のコードに置き換えます。

    using System;
    using System.Web;
    using Microsoft.AspNet.SignalR;
    namespace SignalRChat
    {
        public class ChatHub : Hub
        {
            public void Send(string name, string message)
            {
                // Call the broadcastMessage method to update clients.
                Clients.All.broadcastMessage(name, message);
            }
        }
    }
    
  6. ソリューション エクスプローラーでプロジェクトを右クリックし、[追加 |新しい項目。 [ 新しい項目の追加 ] ダイアログで、[ グローバル アプリケーション クラス ] を選択し、[ 追加] をクリックします。

    グローバルの追加

  7. Global.asax.cs クラスで指定されたusingステートメントの後に、次usingのステートメントを追加します。

    using System.Web.Routing;
    using Microsoft.AspNet.SignalR;
    
  8. Global クラスの メソッドに Application_Start 次のコード行を追加して、SignalR ハブの既定のルートを登録します。

    // Register the default hubs route: ~/signalr/hubs
    RouteTable.Routes.MapHubs();
    
  9. ソリューション エクスプローラーでプロジェクトを右クリックし、[追加 |新しい項目。 [ 新しい項目の追加 ] ダイアログで、[Html ページ] を選択し、[ 追加] をクリックします。

  10. ソリューション エクスプローラーで、先ほど作成した HTML ページを右クリックし、[スタート ページとして設定] をクリックします。

  11. HTML ページの既定のコードを次のコードに置き換えます。

    <!DOCTYPE html>
    <html>
    <head>
        <title>SignalR Simple Chat</title>
        <style type="text/css">
            .container {
                background-color: #99CCFF;
                border: thick solid #808080;
                padding: 20px;
                margin: 20px;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <input type="text" id="message" />
            <input type="button" id="sendmessage" value="Send" />
            <input type="hidden" id="displayname" />
            <ul id="discussion">
            </ul>
        </div>
        <!--Script references. -->
        <!--Reference the jQuery library. -->
        <script src="/Scripts/jquery-1.6.4.min.js" ></script>
        <!--Reference the SignalR library. -->
        <script src="/Scripts/jquery.signalR-1.1.4.js"></script>
        <!--Reference the autogenerated SignalR hub script. -->
        <script src="/signalr/hubs"></script>
        <!--Add script to update the page and send messages.--> 
        <script type="text/javascript">
            $(function () {
                // Declare a proxy to reference the hub. 
                var chat = $.connection.chatHub;
                // Create a function that the hub can call to broadcast messages.
                chat.client.broadcastMessage = function (name, message) {
                    // Html encode display name and message. 
                    var encodedName = $('<div />').text(name).html();
                    var encodedMsg = $('<div />').text(message).html();
                    // Add the message to the page. 
                    $('#discussion').append('<li><strong>' + encodedName
                        + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
                };
                // Get the user name and store it to prepend to messages.
                $('#displayname').val(prompt('Enter your name:', ''));
                // Set initial focus to message input box.  
                $('#message').focus();
                // Start the connection.
                $.connection.hub.start().done(function () {
                    $('#sendmessage').click(function () {
                        // Call the Send method on the hub. 
                        chat.server.send($('#displayname').val(), $('#message').val());
                        // Clear text box and reset focus for next comment. 
                        $('#message').val('').focus();
                    });
                });
            });
        </script>
    </body>
    </html>
    
  12. プロジェクトの [すべて保存] を選択します。

サンプルを実行する

  1. F5 を押し、プロジェクトをデバッグ モードで実行します。 HTML ページがブラウザー インスタンスに読み込まれて、ユーザー名の入力を求められます。

    ユーザー名を入力する

  2. ユーザー名を入力します。

  3. ブラウザーのアドレス行から URL をコピーし、それを使用してさらに 2 つのブラウザー インスタンスを開きます。 各ブラウザー インスタンスで、一意のユーザー名を入力します。

  4. 各ブラウザー インスタンスでコメントを追加し、[ 送信] をクリックします。 コメントはすべてのブラウザー インスタンスに表示されます。

    Note

    この単純なチャット アプリケーションでは、サーバー上のディスカッション コンテキストは維持されません。 ハブは、現在のすべてのユーザーにコメントをブロードキャストします。 後でチャットに参加したユーザーには、参加時から追加されたメッセージが表示されます。

    次のスクリーン ショットは、3 つのブラウザー インスタンスで実行されているチャット アプリケーションを示しています。これらはすべて、1 つのインスタンスがメッセージを送信したときに更新されます。

    チャット ブラウザー

  5. ソリューション エクスプローラーで、実行中のアプリケーションの [スクリプト ドキュメント] ノードを調べます。 SignalR ライブラリが実行時に動的に生成する hubs という名前のスクリプト ファイルがあります。 このファイルは、jQuery スクリプトとサーバー側コードの間の通信を管理します。

    生成されたハブ スクリプト

コードを調べる

SignalR チャット アプリケーションは、2 つの基本的な SignalR 開発タスクを示しています。サーバー上でメイン調整オブジェクトとしてハブを作成し、SignalR jQuery ライブラリを使用してメッセージを送受信します。

SignalR Hubs

コード サンプルでは、 ChatHub クラスは Microsoft.AspNet.SignalR.Hub クラスから派生しています。 Hub クラスからの派生は、SignalR アプリケーションを構築するのに便利な方法です。 ハブ クラスにパブリック メソッドを作成し、Web ページの jQuery スクリプトから呼び出すことで、それらのメソッドにアクセスできます。

チャット コードでは、クライアントは ChatHub.Send メソッドを呼び出して新しいメッセージを送信します。 ハブは、 Clients.All.broadcastMessage を呼び出して、すべてのクライアントにメッセージを送信します。

Send メソッドは、いくつかのハブの概念を示しています。

  • クライアントが呼び出すことができるように、ハブでパブリック メソッドを宣言します。

  • このハブに接続されているすべてのクライアントにアクセスするには、 Microsoft.AspNet.SignalR.Hub.Clients 動的プロパティを使用します。

  • クライアントで jQuery 関数 (関数など) を broadcastMessage 呼び出して、クライアントを更新します。

    public class ChatHub : Hub
    {
        public void Send(string name, string message)
        {
            // Call the broadcastMessage method to update clients.
            Clients.All.broadcastMessage(name, message);
        }
    }
    

SignalR と jQuery

コード サンプルの HTML ページは、SignalR jQuery ライブラリを使用して SignalR ハブと通信する方法を示しています。 コードの重要なタスクは、ハブを参照するプロキシを宣言し、サーバーがクライアントにコンテンツをプッシュするために呼び出すことができる関数を宣言し、ハブにメッセージを送信するための接続を開始することです。

次のコードでは、ハブのプロキシを宣言します。

var chat = $.connection.chatHub;

Note

jQuery では、サーバー クラスとそのメンバーへの参照はキャメル ケースです。 このコード サンプルでは、jQuery の C# ChatHub クラスを chatHub として参照しています。

次のコードは、スクリプトでコールバック関数を作成する方法です。 サーバー上のハブ クラスは、この関数を呼び出して、各クライアントにコンテンツの更新をプッシュします。 コンテンツを表示する前に HTML がエンコードする 2 行は省略可能であり、スクリプトの挿入を防ぐ簡単な方法を示します。

chat.client.broadcastMessage = function (name, message) {
        // Html encode display name and message. 
        var encodedName = $('<div />').text(name).html();
        var encodedMsg = $('<div />').text(message).html();
        // Add the message to the page. 
        $('#discussion').append('<li><strong>' + encodedName
            + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
    };

次のコードは、ハブとの接続を開く方法を示しています。 このコードは、接続を開始し、HTML ページの [送信 ] ボタンでクリック イベントを処理する関数を渡します。

Note

この方法では、イベント ハンドラーが実行される前に接続が確立されます。

$.connection.hub.start().done(function () {
        $('#sendmessage').click(function () {
            // Call the Send method on the hub. 
            chat.server.send($('#displayname').val(), $('#message').val());
            // Clear text box and reset focus for next comment. 
            $('#message').val('').focus();
        });
    });

次の手順

SignalR は、リアルタイム Web アプリケーションを構築するためのフレームワークであることを学習しました。 また、SignalR 開発タスクをいくつか学習しました。SignalR を ASP.NET アプリケーションに追加する方法、ハブ クラスを作成する方法、ハブからメッセージを送受信する方法についても説明しました。

このチュートリアルのサンプル アプリケーションまたは他の SignalR アプリケーションをインターネット経由で使用できるようにするには、ホスティング プロバイダーにデプロイします。 Microsoft は、無料の Windows Azure 試用版アカウントで最大 10 個の Web サイトに無料の Web ホスティングを提供しています。 サンプル SignalR アプリケーションをデプロイする方法のチュートリアルについては、「SignalR はじめに サンプルを Windows Azure Web サイトとして発行する」を参照してください。 Visual Studio Web プロジェクトを Windows Azure Web サイトにデプロイする方法の詳細については、「ASP.NET アプリケーションを Windows Azure Web サイトにデプロイする」を参照してください。 (注: WebSocket トランスポートは、現在、Windows Azure Web サイトではサポートされていません。WebSocket トランスポートを使用できない場合、SignalR は、「 SignalR の概要」トピックの「トランスポート」セクションで説明されているように、他の使用可能なトランスポートを使用します)。

SignalR 開発の高度な概念については、SignalR ソース コードとリソースに関する次のサイトを参照してください。