はじめに
最近のエンターテインメント界では、オンデマンド型のコンテンツ配信が増えています。音楽や映像を自分の都合のよい時間に視聴できるのは、リビングで楽しむ側にとっては便利です。こうした機能は、Webベースのアプリケーションでは必須と考えられることが多くなっています。この点をふまえて、Silverlightでは、オンデマンドコンテンツをクラス1つで簡単に取得できるようになっています。WebClientというクラスです。
System.Net.WebClientクラスは、コンテンツを非同期でダウンロードするための特別なユーティリティクラスの役割を果たします。Silverlightでネットワークや通信関連の処理を行う方法は他にもいくつかありますが、このクラスは2つの点で違いがあります。1つは、ダウンロード要求の進行状況を確認できること、もう1つは、他の方法のようなデリゲート型のモデルではなく、イベントベースのモデルを利用したAPIだということです。このクラスでは、画像、音楽、動画などのファイルや、複数のファイルを取りまとめた圧縮ファイル、各種のアプリケーションモジュールなどを取得するための要求を実行できます。WebClientは、あらゆる種類のコンテンツをオンデマンドで動的に取得できるクラスなのです。
オンデマンドでコンテンツを取得するには、最初にダウンロードの要求処理を行います。また、コンテンツのサイズは非常に大きい場合があるので、その対処方法を考えておくことも欠かせません。さらに、ダウンロード要求が正常に完了した後で、コンテンツの読み込み処理を行う必要があります。この記事では、これらの各手順について、順を追って見ていくことにします。なお、この記事の内容は、拙著『Silverlight 2 in Action』をベースとしています。そちらの本では、Silverlight 2向けのアプリケーションを短時間で作成するための情報について、深く掘り下げて解説しています。
コンテンツの要求処理
WebClientクラスには、コンテンツを要求するためのメソッドが2つあります。1つはDownloadStringAsync、もう1つはOpenReadAsyncです。両者はよく似ていますが、DownloadStringAsyncは文字列関連のデータを取得するためのメソッド、OpenReadAsyncはバイナリコンテンツを取得するためのメソッドという違いがあります。このセクションでは、2つのメソッドを使った処理方法をそれぞれ見ていきましょう。
文字列コンテンツの要求
DownloadStringAsyncメソッドでは文字列関連のコンテンツをダウンロードできます。例えば、JSON、XML、オープンなテキスト形式のデータなどです。いずれの種類のデータも、DownloadStringAsyncメソッドでダウンロード処理を開始します。処理は非同期に進み、ダウンロードが完了するかエラーが発生するまで続きます。ダウンロード処理を開始するコードの例をコード1に示します。
public void RequestStringContent()
{
Uri uri = new Uri("http://www.somedomain.com/rss.xml"); (1)
WebClient webClient = new WebClient();
webClient.DownloadStringAsync(uri); (2)
}
このコードは、WebClientを使って文字列ベースのコンテンツを要求する処理の例です。まず、ダウンロードの対象コンテンツを表すUriオブジェクトを定義します(1)。その後、このUriオブジェクトをパラメータとしてDownloadStringAsyncメソッドに渡しています(2)。このメソッドによって、Uriが表すコンテンツのダウンロードが始まります。コンテンツの取得にはHTTP GETメソッドが使われます。なお、バイナリコンテンツを取得する場合もHTTP GETが使われます。
バイナリコンテンツの要求
バイナリコンテンツの要求にはOpenReadAsyncメソッドを使います。例えば、圧縮ファイル(.zipファイル)、アプリケーションモジュール(.dllファイル)、メディアファイルなどを非同期でダウンロードできます。コード2はその例です。
public void RequestStreamContent()
{
Uri uri = new Uri("http://silverlightinaction.com/video3.wmv");
WebClient webClient = new WebClient();
webClient.OpenReadAsync(uri); (1)
}
このコードは、WebClientを使ってバイナリコンテンツを要求する処理の例です。コードの内容は、文字列コンテンツのダウンロードとよく似ています。唯一の違いは、バイナリコンテンツの場合にはOpenReadAsyncメソッドを使う(1)ということだけです。さて、いずれの種類のコンテンツをダウンロードする場合も、データのサイズを考慮することが重要です。一般に、ダウンロードサイズが大きい場合には、ユーザーの操作感や利便性を高めるための機能を追加する必要があります。次のセクションではその方法を見ていくことにしましょう。
