ダウンロードしたコンテンツの読み込み(1)
先ほど説明したように、コンテンツを要求する方法には、DownloadStringAsyncメソッドとOpenReadAsyncメソッドの2つがあります。そして、そのどちらを使ったかによって、ダウンロードしたコンテンツの利用方法が変わります。つまり、DownloadStringAsyncメソッドを使った場合には、コンテンツを文字列として取得でき、OpenReadAsyncメソッドを使った場合には、コンテンツをStreamオブジェクトとして取得できます。いずれの場合も、ダウンロード要求の処理が完了するまではコンテンツを利用できません。
ダウンロード要求が完了すると、それに対応するイベントが発生します。このイベントも、最初のコンテンツ要求で使用したメソッドに応じて異なります。具体的には、コンテンツの要求にDownloadStringAsyncメソッドを使用した場合にはDownloadStringCompletedイベントが発生し、OpenReadAsyncメソッドを使用した場合にはOpenReadCompletedイベントが発生します。これらのイベントハンドラを使ってコンテンツを読み込むことになります。
このセクションでは、ダウンロードしたコンテンツを読み込む方法を見ていきます。それにはまず、DownloadStringCompletedイベントかOpenReadCompletedイベントのイベントハンドラを作成します。そのハンドラを使って、文字列やメディアファイル、フォント、圧縮ファイル、アプリケーションモジュールなどの各種コンテンツを読み込みます。また、場合によっては、ダウンロードの完了前にキャンセルやエラーが発生することがあります。そのようにしてダウンロード要求が中断された場合の対応方法についても見ておくことにします。
文字列コンテンツの読み込み
Web上でのマッシュアップを実現するうえで、文字列コンテンツの読み込みは重要な処理です。テキスト、JSON、XML、XAMLなどの形式でデータが公開されていることが多いからです。DownloadStringAsyncメソッドではこうした形式のデータをダウンロードできます。そして、ダウンロード処理が完了すると、DownloadStringCompletedイベントハンドラでその内容を取得できます。コード5はその例です。
private void RequestContent()
{
Uri address = new Uri(
"http://ws.geonames.org/findNearByWeatherJSON?
lat=35.82&lng=-84.04");
WebClient webClient = new WebClient();
webClient.DownloadStringCompleted += new
DownloadStringCompletedEventHandler
(webClient_DownloadStringCompleted);
webClient.DownloadStringAsync(address); (1)
}
void webClient_DownloadStringCompleted(object sender, (2)
DownloadStringCompletedEventArgs e) (3)
{
MessageBox.Show(e.Result); (4)
}
このコードでは、WebClientオブジェクトを使って、JSON形式のデータを返すWebサービスを呼び出しています。呼び出しはDownloadStringAsyncメソッドで行います(1)。前述のとおり、このメソッドでは、文字列ベースのコンテンツのダウンロードが非同期で開始されます。ダウンロードが完了すると、DownloadStringCompletedイベントが発生します(2)。ダウンロードしたコンテンツはこのイベントにstringとして渡され、DownloadStringCompletedイベントハンドラの2番目のパラメータを通じて取得できます(3)。コードを見ると分かるように、このパラメータはDownloadStringCompletedEventArgs型のオブジェクトです。
DownloadStringAsyncメソッドの呼び出しで取得したデータは、DownloadStringCompletedEventArgs型のResultプロパティに格納されています(4)。string型のパブリックプロパティです。このプロパティにより、JSON、XML、XAMLなど、最初の要求に対するテキストベースの応答データを取得できます。なお、Resultプロパティでは、DownloadStringAsyncメソッドでダウンロードを開始したバイナリ形式のデータの文字列表現も取得できますが、メディアコンテンツなどのバイナリデータを読み込む場合には、次に説明する方法の方が適切です。
メディア・コンテンツの読み込み
『Silverlight 2 in Action』の第7章でも述べたように、現在のWebでは、静止画、音楽、動画などのメディアが重要な役割を果たしています。こうしたメディアは、サーバ上にバイナリファイルとして保存してあるのが一般的ですが、場合によっては、サーバがコンテンツを動的に生成してネットワーク経由で送って来るケースもあります。いずれの場合も、DownloadStringAsyncの呼び出しで得られるstring型のデータでは役に立ちませんので、別の方法でメディアコンテンツを動的に読み込む必要があります。
メディアコンテンツを動的に読み込むには、まずOpenReadAsyncメソッドを呼び出します。前述のとおり、バイナリコンテンツのダウンロードで使用するメソッドです。ダウンロードが完了すると、OpenReadCompletedイベントが発生します。このイベントの中で、SetSourceというメソッドを使ってメディアコンテンツを読み込みます。その実行例をコード6に示します。
private void RequestContent() (1)
{
Uri address =
new Uri("http://www.silverlightinaction.com/video2.wmv");
WebClient webClient = new WebClient();
webClient.OpenReadCompleted += new
OpenReadCompletedEventHandler( (2)
webClient_OpenReadCompleted);
webClient.OpenReadAsync(address); (3)
}
void webClient_OpenReadCompleted(object sender,
OpenReadCompletedEventArgs e) (4)
{
myMediaElement.SetSource(e.Result); (5)
}
このRequestContentメソッドのコードでは、動画をオンデマンドで読み込む処理を行っています(1)。リモートサーバからの動画の要求はOpenReadAsyncメソッドで行います(3)。このメソッドは、要求した動画をStreamとしてダウンロードします。このストリームは、OpenReadCompletedイベントが発生した時点で利用可能になります(2)。ダウンロードしたStreamは、OpenReadCompletedEventArgsのResultプロパティで取得できます(4)。コード6の場合、このStreamが、目的のメディアファイルを表します。
Streamからメディアコンテンツを読み込むときには、SetSourceというメソッドを使います(5)。SetSourceメソッドでは、メディア関連の項目のSourceプロパティに、ダウンロードしたStreamを設定できます。メディア関連の項目のSourceプロパティではUriを指定できるのが一般的ですが、SetSourceメソッドではStreamを読み込ませることができます。この方法はBitmapImage、MediaElement、VideoBrushの各オブジェクトに対して使用できます。これらの型から分かるように、SetSourceメソッドは、オンデマンドでメディアを利用するときに役立つメソッドです。一方、オンデマンドでのフォントのダウンロードは、別の方法で対処します。
