Data for Silverlight
Web サービスを使用したデータの取得

いよいよデータを取得して、ユーザーに表示します。次の手順に従います。

  1. MainPage.xaml.cs ファイルを開き、ファイルの先頭にあるブロックに次の using 文を追加します。
    コードのコピー
    using System.IO;
    using C1.Silverlight.Data;
    using MasterDetail.DataService;
    
    次に、Page コンストラクタを以下のように変更します。
    コードのコピー
    public Page()
    {
      InitializeComponent();
      LoadData();
    }
    
       
  2. 次のコードを追加して LoadData メソッドを実装します。このメソッドは、Web サービスを呼び出してデータを取得し、それを DataSet オブジェクトに格納します。次に、このオブジェクトをページ上のコントロールに連結します。
    コードのコピー
    DataSet _ds = null;
    void LoadData()
    {
      // Web サービスを呼び出します
      var svc = new GetDataService();
      svc.GetDataCompleted += svc_GetDataCompleted;
      svc.GetDataAsync("Categories,Products");
    }
     
    void svc_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
    {
      // エラーを処理します
      if (e.Error != null)
      {
        _tbStatus.Text = "データのダウンロードに失敗しました。";
        return;
      }
     
      // サーバーからのデータストリームを解析します(XML から DataSetを取得)
      _tbStatus.Text = string.Format(
        "データ取得中:{0:n0} KB", e.Result.Length / 1024);
      var ms = new MemoryStream(e.Result);
      _ds = new DataSet();
      _ds.ReadXml(ms);
     
      // データを取得し、コントロールをデータに連結します
      BindData();
    }
    
  3. 次の GetDataService メソッドの実装を追加します。
    コードのコピー
    // 現在のホスト/ドメインに関連するデータサービスを取得します
    DataServiceSoapClient GetDataService()
    {
      // バッファサイズを増やします
      var binding = new System.ServiceModel.BasicHttpBinding();
      binding.MaxReceivedMessageSize = 2147483647; // int.MaxValue
      binding.MaxBufferSize = 2147483647; // int.MaxValue
     
      // サービスの絶対アドレスを取得します
      Uri uri = GetAbsoluteUri("DataService.asmx");
      var address = new System.ServiceModel.EndpointAddress(uri);
     
      // 新しいサービスクライアントを返します
      return new DataServiceSoapClient(binding, address);
    }
     
    public static Uri GetAbsoluteUri(string relativeUri)
    {
      Uri uri = System.Windows.Browser.HtmlPage.Document.DocumentUri;
      string uriString = uri.AbsoluteUri;
      int ls = uriString.LastIndexOf('/');
      return new Uri(uriString.Substring(0, ls + 1) + relativeUri);
    }
    

GetDataService メソッドは、新しい DataServiceSoapClient オブジェクトをインスタンス化して返します。デフォルトコンストラクタは開発環境(http://localhost など)を参照するため、ここでは使用しません。デフォルトコンストラクタは開発マシンでは正常に機能しても、アプリケーションの展開時には機能しません。また、デフォルトコンストラクタは 65 KB バッファを使用しているため、データ転送には小さすぎます。上の GetDataService メソッドの実装は、この2つの問題を解決します。

上の LoadData メソッドは、サービスをインスタンス化し、GetDataAsync メソッドを呼び出します。このメソッドは、実行の終了時に svc_DataCompleted デリゲートを呼び出します。このデリゲートは、DataSet オブジェクトをインスタンス化し、ReadXml メソッドを使用して、サーバーから提供されたデータをデシリアライズします。次に、BindData を呼び出して、ページ上のコントロールにデータを連結します。

メモ:これは、C1.Silverlight.Data DataSet クラスの最も重要な機能の1つです。この機能は、ADO.NET DataSet オブジェクトと同じ XML スキーマを使用します。これにより、アプリケーションはクライアントでデータをシリアライズし、サーバーでそのデータをデシリアライズできます。この逆も可能です。また、オブジェクトモデルがよく似ているので、開発者にとってもわかりやすく、好都合です
関連トピック

 

 


Copyright © GrapeCity inc. All rights reserved.