連載:コードから触るIIS 8

連載:コードから触るIIS 8

IIS 8でさわるSignalR 2.0

2013年11月20日

SignalR 2.0をIIS 8(WebSocket)で動かす方法を説明。Windows Server/IIS、.NET/Visual Studioに関するアップデートについても簡単に紹介。

株式会社グラニ 田中 孝佳
  • このエントリーをはてなブックマークに追加

Windows Server 2012 R2などのアップデートについて

 今回の本題であるSignalRの説明に入る前に、Windows Server/IISおよび.NET FrameworkとVisual Studioに関するアップデートについて紹介する。

Windows Server 2012 R2

 Windows Server 2012のアップデートに当たるWindows Server 2012 R2では仮想/クラウド関連機能やネットワーク機能を中心に強化されている。PowerShellのバージョンが4.0に上がり、DSC(Desired State Configuration)がサポートされている。またIISのバージョンが8.5になっている。

IIS 8.5

 IIS 8.5では、ロギング機能の拡張といった管理性の向上と、多数のWebサイトをホスティングするサーバー向けのスケーラビリティの向上が計られている。

.NET 4.5.1

 .NET 4.5.1は.NET 4.5を置き換える形でインストールされる。もしくは、Windows 8.1およびWindows Server 2012 R2では最初からインストールされている。.NET 4.5に比べ、小規模なアップデートになっており、「開発生産性」「アプリケーション性能」「継続的イノベーション」に着目したアップデートになっている。特に開発生産性については、Visual Studio 2013の新機能から利用可能になっている(例えばCodeLensなどの機能)。

ASP.NET

 .NET 4.5.1と同時期にアップデートされたが、.NET 4.5での利用も可能である。ASP.NET MVC 5、ASP.NET Web API 2、SignalR 2.0などのアップデートが含まれている。One ASP.NETとして、Webフォーム、MVC、Web APIなどさまざまな技術をASP.NET上で利用できるようになっている。

Visual Studio 2013

 Visual Studio 2013では、上で述べた.NET 4.5.1に対応したデバッグ機能の強化や、新しいASP.NET向けのプロジェクトテンプレートに加え、Microsoftアカウントによる設定の共有や、コードマップの表示などの機能が追加されている。

 今後も本連載では引き続き、Windows Server 2012上のIIS 8を取り上げるが、サンプルとして動かすASP.NETアプリについてはVisual Studio 2013によって開発したASP.NET 5を取り上げる。Windows Server 2012 R2およびIIS 8.5に関しては次回紹介する予定である。

SignalRとは

 SignalRとは、リアルタイム・非同期・双方向といった機能を容易に実現するためのライブラリである。One ASP.NET(次の図)のビジョンの中でも中核を占める1つのコンポーネントになっている。ASP.NETの更新と合わせて、Signal R 2.0がリリースされている。2.0の概要はGitHub上のリリースノート、もしくは公式ページで確認できる。

One ASP.NETを表現した図(Scott Hanselman氏のブログより転載)

SignalRに触れてみる

 もし、まだSignalRで作られたWebサイトもしくはサービスに触ったことがない方がいたら、ぜひ下記のリンク先のWebサイトにアクセスしてみてほしい。

SignalRが実現するもの

 Webアプリケーションは「HTTP」プロトコルを前提にしているが、通常、「クライアントからサーバーへリクエストを投げ、サーバーがレスポンスを返す」という仕組みになっている。この仕組みだと、サーバーが任意のタイミングでクライアントにレスポンスを返すことはできない。そこで、SignalRではクライアントとサーバーの間に永続的なコネクションを生成し、リアルタイム・非同期・双方向といった機能を実現している。

 このように書くと、SignalRが独自の技術を用いて機能を実装しているように理解されるかもしれないが、そうではない。ASP.NETもしくはIISといったプラットフォームに依存しない技術として、iFrame、Server Sent Events、Ajax Long Polling、WebSocketといったものを内部的に利用している。クライアントのOSやブラウザーの種類/バージョン、さらにはサーバー側の対応状況によって、今挙げた技術の中で利用可能なもの/不可能なものがあり、SignalRは接続時に利用可能なものを自動的に選択する機能も持っている。ちなみに、このような利用可能なプロトコルを自動選択する機能を持ったライブラリとしては、Node.jsにおけるSocket.IOなどがある。

 なお、先ほど挙げた内部的に利用している技術だが、その中ではWebSocketがW3CおよびIETFにより標準化され、幅広いプラットフォームで利用可能になっている。Windowsでも、IIS 8で標準対応され(詳細は後述)、クライアント側もWindows 8から包括的に利用可能になっている。

SignalR 2.0をIIS 8で動かす

 それでは、実際にIISでSignalR 2.0を動かしてみたいと思う。今回は簡単なサンプルを動かすところまでを目標とし、大規模サイトで必要なサーバー複数台を用いたスケーリングを次回で取り上げる予定である。

 第4回同様、第3回の記事にある内容でIIS 8をセットアップしておいてほしい。第4回を試されたサーバーをそのまま利用したい場合は、Webサイトのディレクトリ(サンプルのとおりであれば、「C:\www\BuildInsider\」)以下のファイルを全て削除し、applicationHost.configファイルに対して行った変更を元に戻しておいてほしい。

 さて、IIS側のセットアップであるが、SignalR自体を動かすための必要な手順はない。ASP.NETがホスティングできるようにWeb Serverを設定していればSignalRも動作可能である。ただし、WebSocketプロトコルのサポートについては注意が必要である。第1回で紹介した手順でIISをインストールしていれば、WebSocketプロトコルのサポートに必要な機能もインストールされている。ここで、実際にインストールされていることを確認してみよう(次のコマンドを実行すると、その下の画面のような結果が表示される)。

PowerShell
Get-WindowsFeature -Name *WebSocket*
WebSocketプロトコルサポートの機能がインストールされているかを確認するコマンド
WebSocketプロトコルサポートの機能がインストールされている場合の、上記のコマンドの実行結果

 それでは、実際にSignalR 2.0のアプリケーションを動かしてみる。今回はSignalRのサイトで紹介されているものを一部編集したサンプル(.zipファイル内のAppInit_1フォルダー)GitHub上に用意しておいたので利用してほしい。なお、今回はこのサンプルアプリで記述しているSignalRのコードに関する説明は割愛する。適宜公式サイトおよびコード中のコメントを参照してほしい。

 これをVisual Studio 2013でビルドし、IISのWebサイト(第3回の手順に従っていれば「C:\www\BuildInsider」以下のディレクトリ)に配置する。配置したらWebブラウザーで見てみよう。第3回の手順に従い、80番ポートにバインディングしている場合にサーバーから接続する場合、URLは「http://localhost/Default.html」である。サーバーと異なるクライアントから接続する場合は「localhost」をサーバーのアドレスに置き換えてほしい。

SignalRのサンプルにアクセスした場合の表示例

 上の画面のように赤い四角が表示されたら、その四角をマウスドラッグで移動できることを確認してほしい(正常に移動できない場合は、IEであればF12開発者ツールで、[ドキュメント モード]が「標準」になっているかを確認してほしい)。次に別のブラウザー、もしくは別のクライアントから同じページに接続してみよう。片方のブラウザーで赤い四角をマウスドラッグで移動させると、別のブラウザーでも追随するはずだ(次の画面はその例)。

1つのブラウザーで赤い四角を移動させると、もう片方のブラウザーで追随する

 これは、マウスドラッグしているブラウザーから「赤い四角を移動させた」という情報がサーバーに送信され、SignalRを使って書かれたコードを経由して、SignalRのハブに接続している全ブラウザーに送信され、移動させていない方のブラウザーでもその移動に追随しているように赤い四角を移動させているからである。

 さて、これがWebSocketプロトコルで動いていることを確認するために、ブラウザーに搭載されている開発者ツールを開いてほしい。なお、WebSocketで動くためにはクライアント側もWebSocketをサポートしている必要がある。Windows 8もしくはServer 2012のInternet Explorer 10もしくはWindows 8.1のInternet Explorer 11であれば基本的にサポートされているはずである。Internet Explorerであれば、[F12]キーを押しF12開発者ツールを開き、[ネットワーク]タブを開いて[キャプチャの開始]ボタンを押してから、再度、Default.htmlを読み込み直す。

 すると、下の画面のようにページを表示させるまでのリクエストは表示されるが、以降、赤い四角を移動させても、他のリクエストは表示されない(IE拡張を入れている環境によっては、IE拡張による通信が表示される可能性がある)。これは、「101 switching protocols」というステータスのレスポンスがサーバーから返され、以降、WebSocketプロトコルによる通信が使われているからである。Chromeなど一部のブラウザーの開発者ツールのネットワークキャプチャ機能では、この101ステータスレスポンスが表示されることもある。

IE10のF12開発者ツールによるネットワークキャプチャの様子

キャプチャを開始してから、ページを再読み込みすると1のようなリクエストのリストが表示されるが、以降、赤い四角をドラッグしてもここに追加されることはない。

Chromeの開発者ツールによる101ステータスレスポンスの確認

1のところで、101ステータスが確認できる。

 さて、WebSocketプロトコルで通信しているのは、IISのWebSocketプロトコルサポート機能をインストールしているからである。この機能をインストールしていない場合、WebSocket以外のクライアントがサポートしているプロトコルで通信することになる。同じIIS 8でWebSocketプロトコルのサポートを外した状態で、IE10で先ほどのページにアクセスして、開発者ツールでネットワークをキャプチャすると、次の画面のように「Forever Frame」で通信することが分かる。

WebSocketプロトコルサポートがインストールされていないIISで動かした場合のネットワークキャプチャ

1で表示されているとおり、WebSocketの代わりに、Forever Frame(iFrame)が使われ、ネットワークキャプチャに表示されていることが分かる。

 このように、IIS 8を使うと、WebSocketプロトコルサポートをインストールすることによって、SignalRを使って簡単にWebSocketを使ったリアルタイムなWebアプリを作ることができる。

大規模サイトでのSignalR

 さて、このように単純なSignalRのアプリケーションであれば、IISを1台セットアップするのみで動かせる。しかし、本番環境でサービス稼働させるような、同時接続数の多い環境でのSignalRを使うことによるサーバーへの負荷はどうであろうか。また、Webサイトを複数台用意してスケーリングさせた場合、異なるWebサーバーに接続しているクライアントに情報配信するにはどのようにすればいいのであろうか。このような内容に関して、IIS 8.5に関する次回記事を挟み、次々回以降で紹介したいと思う。

※以下では、本稿の前後を合わせて5回分(第3回~第7回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

3. C#でアプリケーション・プールの設定とWebサイトの作成

IISでのWebサイトの作成をC#コードから行ってみよう。一連の開発手順とコードを分かりやすく解説。

4. オート・スタートによるアプリケーションの初期化処理とメンテナンスページ

IISによるWebサイト起動時に何らかの処理を行うための方法を解説。また、メンテナンスページをIISにより実現する方法も紹介。

5. 【現在、表示中】≫ IIS 8でさわるSignalR 2.0

SignalR 2.0をIIS 8(WebSocket)で動かす方法を説明。Windows Server/IIS、.NET/Visual Studioに関するアップデートについても簡単に紹介。

6. Windows Server 2012 R2とIIS 8.5の新機能

先日(11月1日)から製品販売が開始されている「Windows Server 2012 R2」の新機能の中から「PowerShell DSC」について紹介。また、そのOS上で動くIISの最新版「IIS 8.5」の新機能も説明する。

7. RedisをBackplaneとしたSignalRのスケールアウト

SignalRアプリをスケールアウトする際の注意点と、それを回避するためのBackplane機構について説明。さらにRedisをBackplaneとして活用する方法を解説する。

サイトからのお知らせ

Twitterでつぶやこう!