JavaScriptファイルからADO.NET Data Servicesにアクセスする
続いて、JavaScriptファイルからData Servicesにアクセスする方法について解説します。DataServicesHostプロジェクト上のDefault.aspxファイルはまだ未着手状態なので、そこにScriptManagerコントロールを配置します。コントロールの配備はこれだけです。
Data ServicesにアクセスするためのJavaScriptファイルとしてCodePlexに、AJAX Client Library for ADO.NET Data Servicesというライブラリが公開されています。こちらをダウンロードし、展開したフォルダ内に格納されている「DataService.js/DataService.debug.js」をプロジェクト内に追加します。
ここで、簡単にですが、AJAX Client Library for ADO.NET Data Services(以下、AJAXクライアント ライブラリ)について解説します。AJAXクライアント ライブラリはクライアントページとData Servicesに対する橋渡しの機能が詰まったクラスが提供されています。大別すると以下の4つのクラスがあります。
クラス | 概要 |
ActionResult | Data Servicesに対する操作結果の表示 |
ActionSequence | Data Servicesに対する複数の操作を行うためのオブジェクトを生成 |
DataService | Data Servicesに対する操作を行うためのオブジェクトを生成 |
DataServiceError | Data Servicesからのエラーを渡す |
通常利用する場合には、DataServiceクラスの利用が多くなると思います。DataServiceクラスは次のメソッドを持っています。
メソッド | 機能 |
query | Data Servicesのデータを取得 |
update | Data Servicesのデータを更新 |
insert | Data Servicesのデータを作成 |
remove | Data Servicesのデータを削除 |
AJAXクライアント ライブラリは、現在はCodePlex上でのみの配布となっていますが、どうやらASP.NET AJAX 4.0からは標準搭載となるようです。現在CodePlex上で配布されているASP.NET AJAX 4.0 Preview 3では''ASP.NET Library for ADO.NET Data Services''という名称で格納されています。また、ASP.NET AJAX 4.0のDataViewコントロールという新コントロールにJavaScriptファイルから直接バインディングもできるようになるようです。つまり、今後ASP.NETとData Servicesは、より密な連携ができるようになるでしょう。
サンプルの作成に戻ります。一通りの準備が完了しているので、実際にJavaScriptファイルからData Servicesにアクセスしてみましょう。実行結果は図11のようになります。
また、実行時にロギングツールWeb Development Helperを利用してロギングしたHTTPヘッダーは図12に、レスポンスコンテキストは図13になります。
AJAXクライアント ライブラリはサーバへのHTTPリクエスト時に、Content-Typeヘッダを''application/json''を指定しているので、通信はJSON形式で行われています。
<script type="text/javascript"> // (1) // ページロード時のイベント function pageLoad() { // アドレスを設定してDataServiceオブジェクトの生成 pubsService = new Sys.Data.DataService("/PubsAstoria.svc"); // titlesエンティティの読み込みと成功/失敗時のイベント設定 pubsService.query("titles", OnSuccess, OnFailure); } // (2) // titlesエンティティ読み込み成功時イベント function OnSuccess(result, context, operation) { // StringBuilderクラスを使ってテーブルを生成 var Builder = new Sys.StringBuilder(); Builder.append("<table cellpadding=3 cellspacing =2 border =2>"); Builder.append("<th>TitleID</th>"); Builder.append("<th>Title</th>"); Builder.append("<th>Type</th>"); Builder.append("<th>Price</th>"); Builder.append("<th>Notes</th>"); // 取得したレコード分テーブル行を出力 for (num in result) { var titles = result[num]; Builder.append("<tr><td>"); Builder.append(titles.title_id); Builder.append("</td><td>"); Builder.append(titles.title); Builder.append("</td><td>"); Builder.append(titles.type); Builder.append("</td><td>"); Builder.append(titles.price); Builder.append("</td><td>"); Builder.append(titles.notes); Builder.append("</td></tr>"); } Builder.append("</table>"); // divタグに生成したテーブルを注入する $get("titlestable").innerHTML = Builder.toString(); } // (3) // titlesエンティティ読み込み失敗時イベント function OnFailure(error, context, operation) { // エラー表示Spanタグの取得 var span = $get("ErrorMessage"); // エラーメッセージにサーバー側から渡された情報を設定 span.innerHTML = BuildErrorString(operation); // Spanタグを表示設定に変更 span.style.display = "inline"; } </script> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> <Scripts> <asp:ScriptReference Path="~/DataService.js" /> </Scripts> </asp:ScriptManager> <div id="titlestable"></div> <span id="ErrorMessage" style="display:none;"></span> </form>
HTMLフォーム側では、ScriptManagerコントロールに、DataService.jsを参照設定している他、divタグ、spanタグにそれぞれIDを設定し、spanタグは非表示設定にしています。
JavaScript側の設定は長いので、コメント欄に記述した番号順に解説します。
(1)では、ページロード時に呼ばれるイベントとして、Data Servicesのアドレスを設定してオブジェクトを生成しています。そして、queryメソッドを使い、第一パラメータに設定した''titles''エンティティの取得を行い、第二・三パラメータで、それぞれ成功時、失敗時のイベントを設定しています。
(2)では、titlesエンティティの取得が成功した場合のイベント処理が記述されています。成功時の戻り値はJSON形式となっています。そこで、文字列整形にMicrosoft AJAX LibraryのSys.StringBuilderクラスのappendメソッドを使い、文字列を追加していくことでテーブルを成形しています。今回は全ての項目ではなく、TitleID/Title/Type/Price/Notes5つの項目を表示するテーブルです。ポイントはヘッダー以外のデータが含まれている行をfor文で繰り返し出力している点です。最後は整形したテーブルを挿入しています。
(3)では、titlesエンティティの取得が失敗した場合のイベント処理の記述ですが、第三戻り値にサーバー側のエラーメッセージが渡されるので、それをSpanタグに設定し、表示を非表示から表示似変更しています。
.NETのクライアント ライブラリ程簡単ではありませんが、JavaScriptからもData Servicesにアクセスすることが確認できたかと思います。
まとめ
Data Servicesは.NET開発者の大半が利用していたSOAP形式のサービスから、REST形式なサービスへと変換させる大きなテクノロジであることがお分かり頂けたかと思います。
サービス自体はシンプルに作成できます。アクセス権、公開するテーブルなどはアプリケーションによって設定が変わりますが、それでも従来のSOAP形式のサービスよりも簡単に作成できます。
つまりData Servicesは、いかにしてそのサービスを利用するのかがポイントになってくるかと思いますが、多分Data Servicesの利用者のほとんどが.NETアプリケーションと連携して利用すると思うので、本稿が参考になれば幸いです。
また、クライアント ライブラリと、LINQ to ADO.NET Data Servicesを利用したデータの検索・追加・更新・削除は、結局のところはData Servicesを経由してEDMに対してクエリを行っていることを確認できました。Dynamic Dataもそうですが、SP1で追加された機能は基本的にEntity Frameworkに深く依存しています。V2.0では大きく改良されるかと思いますが、PDC 2008で公開されたサービスの一部もData Servicesを利用しているので将来を見据えて早い段階からData Servicesを活用することをお勧めします。
次回で本連載はひとまず終了です。最終回はVS2008 SP1で追加されたScriptManagerコントロールの新機能と、11月にリリースされたASP.NET for Silverlightコントロールについて解説します。お楽しみに。