チュートリアル > クライアント側の実装 > Web サービスを使用したデータの取得 |
いよいよデータを取得して、ユーザーに表示します。次の手順に従います。
コードのコピー
|
|
---|---|
using System.IO; using C1.Silverlight.Data; using MasterDetail.DataService; |
コードのコピー
|
|
---|---|
public Page()
{
InitializeComponent();
LoadData();
}
|
コードのコピー
|
|
---|---|
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(); } |
コードのコピー
|
|
---|---|
// 現在のホスト/ドメインに関連するデータサービスを取得します 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 スキーマを使用します。これにより、アプリケーションはクライアントでデータをシリアライズし、サーバーでそのデータをデシリアライズできます。この逆も可能です。また、オブジェクトモデルがよく似ているので、開発者にとってもわかりやすく、好都合です |