3.SilverlightからWebサービスの参照
Silverlightから「2.」で作成したWebサービスを呼び出すために、サービスリファレンスを作成します。
SilverlightDemoプロジェクトを右クリックし、サービス参照の追加から「2.」で作成したWebサービスを参照します。
今回は、SilverightをホストするASP.NETと同じアプリケーションでWebサービスをホストするため、[探索]ボタンをクリックすることで「2.」で作成したWebService1を検索できます。
ここで、「アドレスからメタデータをダウンロードするときに、エラーが発生しました。有効なアドレスを入力していることを確認してください。」といったメッセージが表示された場合は、Silverlightで参照する前に一度WebサービスをVisual Studioからデバック実行して見てください。
また、Silverlightをホストするドメイン以外のWebサービスを参照する場合は、後述するクロスドメインの制限がありますので注意してください。
4.Webサービスの呼び出し
「3.」で作成したWebサービスのプロキシクラスからWebService1のHelloWorld
メソッドを呼び出します。
SilverlightプロジェクトのPage.xamlのXAMLにWebサービスを呼び出すためのボタンを記述します([リスト1])。
<UserControl x:Class="SilverlightDemo.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"> <Grid x:Name="LayoutRoot" Background="White"> <Button Height="30" Margin="100,100,100,0" Content="サービスの呼び出し" Click="Button_Click"/> </Grid> </UserControl>
これでWebサービスを呼び出すための準備が終わったので、C#から作成したWebサービスを呼び出してみましょう。
Page.xaml.csを開き、Page
クラスにボタンクリックのイベントハンドラを作成します([リスト2])。
private void Button_Click(object sender, RoutedEventArgs e) { // (1) Webサービスプロキシの作成 var service = new ServiceReference1.WebService1SoapClient(); // (2) 呼び出し終了時のイベントハンドラの設定 service.HelloWorldCompleted += (serviceObject, serviceEvent)=> { if (serviceEvent.Error != null) MessageBox.Show("通信エラー:" + serviceEvent.Error.ToString()); else MessageBox.Show(serviceEvent.Result); }; // (3) Webサービスの呼び出し service.HelloWorldAsync(); }
Silverlightアプリケーションでは、Webサービスの呼び出しは非同期(Async)のみサポートされています。このためSilverlightでWebサービスを呼び出す場合は次の手順でサービスを呼び出す必要があります。
- Webサービスプロキシの作成
- 呼び出し終了時のイベントハンドラの設定
- Webサービスの呼び出し
これでWebサービスを呼び出すためのコードが記述できたので、Visual Studioメニューの[デバック]-[デバックの開始]から[Silverlight]を起動してみましょう。
起動すると次のような画面が表示されるので、サービスの呼び出しボタンをクリックしてください。メッセージボックスが表示され、HelloWorldが表示されるはずです。
自動生成されたプロキシクラスを使うことで、ネットワークプログラムやXMLからのデータの読み出しを意識せず、静的に型付けされたコードからサーバーサービスを呼び出すことができます。
サーバー側をASP.NETで作成する場合、Silverlightから呼び出すサービスをASP.NETWebサービス/ASP.NET WCFで作成し、サービスリファレンスによる参照を行うことで安全に、簡単にアプリケーションを作成することができます。