チュートリアル: SignalR 2 を使用したリアルタイム チャット

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

このチュートリアルでは、次の作業を行いました。

  • プロジェクトのセットアップ
  • サンプルを実行する
  • コードを確認する

警告

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

前提条件

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

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

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

    Web の作成

  2. [ 新しい ASP.NET プロジェクト - SignalRChat ] ウィンドウで、[ 空] を 選択したまま 、[ OK] を選択します

  3. ソリューション エクスプローラーでプロジェクトを右クリックし、[新しい項目追加>] を選択します。

  4. [ 新しい項目の追加 - SignalRChat] で、[ インストール済みの>Visual C#>Web>SignalR ] を選択し、[ SignalR Hub Class (v2)] を選択します。

  5. クラスに ChatHub という名前を付け、プロジェクトに追加します。

    この手順では、 ChatHub.cs クラス ファイルを作成し、SignalR をサポートする一連のスクリプト ファイルとアセンブリ参照をプロジェクトに追加します。

  6. 新しい ChatHub.cs クラス ファイルのコードを次のコードに置き換えます。

    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);
            }
        }
    }
    
  7. ソリューション エクスプローラーでプロジェクトを右クリックし、[新しい項目追加>] を選択します。

  8. [ 新しい項目の追加 - SignalRChat ] で、[ インストール済みの>Visual C#>Web ] を選択し、[ OWIN スタートアップ クラス] を選択します。

  9. クラスに Startup という名前を付け、プロジェクトに追加します。

  10. Startup クラスの既定のコードを次のコードに置き換えます。

    using Microsoft.Owin;
    using Owin;
    [assembly: OwinStartup(typeof(SignalRChat.Startup))]
    namespace SignalRChat
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                // Any connection or hub wire up and configuration should go here
                app.MapSignalR();
            }
        }
    }
    
  11. ソリューション エクスプローラーで、プロジェクトを右クリックし、[HTML ページ追加]> を選択します。

  12. 新しいページ インデックス に名前を付け、[ OK] を選択します

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

  14. 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-3.1.1.min.js" ></script>
        <!--Reference the SignalR library. -->
        <script src="Scripts/jquery.signalR-2.2.1.min.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>
    
  15. [ソリューション エクスプローラー] で、[スクリプト] を展開します

    jQuery と SignalR のスクリプト ライブラリがプロジェクトに表示されます。

    重要

    パッケージ マネージャーは、SignalR スクリプトの新しいバージョンをインストールしている可能性があります。

  16. コード ブロック内のスクリプト参照が、プロジェクト内のスクリプト ファイルのバージョンに対応していることを確認します。

    元のコード ブロックからのスクリプト参照:

    <!--Script references. -->
    <!--Reference the jQuery library. -->
    <script src="Scripts/jquery-3.1.1.min.js" ></script>
    <!--Reference the SignalR library. -->
    <script src="Scripts/jquery.signalR-2.2.1.min.js"></script>
    
  17. 一致しない場合は、 .html ファイルを更新します。

  18. メニュー バーで、[ファイル][すべて保存] の順に>選択します。

サンプルを実行する

  1. ツール バーで [ スクリプト デバッグ ] をオンにし、再生ボタンを選択してデバッグ モードでサンプルを実行します。

    ユーザー名を入力する

  2. ブラウザーが開いたら、チャット ID の名前を入力します。

  3. ブラウザーから URL をコピーし、他の 2 つのブラウザーを開き、URL をアドレス バーに貼り付けます。

  4. 各ブラウザーで、一意の名前を入力します。

  5. 次に、コメントを追加し、[送信] を選択 します。 他のブラウザーでこれを繰り返します。 コメントはリアルタイムで表示されます。

    Note

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

    チャット アプリケーションが 3 つの異なるブラウザーでどのように実行されるかを確認します。 Tom、Anand、および Susan がメッセージを送信すると、すべてのブラウザーがリアルタイムで更新されます。

    3 つのブラウザーはすべて同じチャット履歴を表示します

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

    [スクリプト ドキュメント] ノードの自動生成されたハブ スクリプト

コードを調べる

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

ChatHub.cs の SignalR Hubs

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

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

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

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

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

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

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

index.htmlの SignalR と jQuery

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

var chat = $.connection.chatHub;

Note

JavaScript では、サーバー クラスとそのメンバーへの参照は camelCase である必要があります。 このコード サンプルでは、JavaScript の C# ChatHub クラスを として chatHub参照しています。

このコード ブロックでは、スクリプトにコールバック関数を作成します。

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 エンコードする 2 行は省略可能であり、スクリプトの挿入を防ぐ適切な方法を示します。

このコードでは、ハブとの接続を開きます。

$.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();
        });
    });

Note

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

このコードは、接続を開始し、HTML ページの [送信 ] ボタンでクリック イベントを処理する関数を渡します。

コードを取得する

完了したプロジェクトのダウンロード

その他のリソース

SignalR の詳細については、次のリソースを参照してください。

次のステップ

このチュートリアルでは、次のことを行います。

  • プロジェクトのセットアップ
  • サンプルを実行しました
  • コードを調べた

SignalR と MVC 5 の使用方法については、次の記事に進んでください。