jQuery から WCF サービスを呼び出すサンプルを [WCF4.0]WCFサービスをjQueryから呼び出す で記載しました。 ASP.NET Web サービス を jQuery から呼び出すプログラムを作成する機会があったので、その方法も覚書として記載します。
呼び出す Webサービス は WCF サービスを jQuiery から呼び出すときに使用した サンプルと基本的に同じです。
動作確認環境は次の通り
- Visual Stusio 2010 Professional
- .NET 4.0
- IE9.0 標準モードで動作確認
サンプルでは NuGet パッケージマネージャーを使用するので インストールしておいてください。
1. サンプルプログラムの作成
Visual Studio 2010 空のWebアプリケーションプロジェクトを作成します。プロジェクトはここでは AsmxJQueryIntegration としました。
1.1 jQuery のインストール
メニューのツール→ライブラリパッケージマネージャー→パッケージマネージャーコンソール をクリックします。下図のように マネージャーコンソールから 次のコマンドを入力して jQuery をインストールします。
Install-Package jquery
GUIを使用して jQuery をインストールすることもできます。プロジェクトを右クリック→ NuGet パッケージの管理をクリックしてパッケージの管理画面を表示、オンラインを選択して、jQuery を検索してインストールすることもできます
1.2 ASP.NET Webサービスの作成
ASP.NET Web サービスを作成します。 新しい項目の追加画面で Web サービスを 選択します。下例では ProductService.asmx という名前で ASP.NET Web サービスを作成しています。
ProductServicw.asmx.cs ファイルを次のように編集します。System.Web.Script.Services名前空間 の ScriptService Attribute を使用して JSON 形式 で データの送受信を行うようにします。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Script.Services; namespace AsmxJQueryIntegration { /// <summary> /// ProductService の概要の説明です /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼び出せるようにするには、次の行のコメントを解除します。 [System.Web.Script.Services.ScriptService] public class ProductService : System.Web.Services.WebService { List<Product> products; public ProductService() { // 適当にサンプルデータ作成 products = new List<Product> { new Product{ ProductId = 1, Name = "Car", UnitPrice=1000}, new Product{ ProductId = 2, Name = "Bicycle", UnitPrice=40000}, new Product{ ProductId = 3, Name = "Train", UnitPrice=5000000} }; } // XmlSerializarはIEnumerable<Product> をシリアライズ // できないため List<Product> に変更しています [WebMethod] [ScriptMethod(UseHttpGet=true)] public List<Product> RetrieveAllProduct() { return products; } [WebMethod] public Product RetrieveProductByName(string name) { var query = from p in products where p.Name == name select p; return query.FirstOrDefault(); } [WebMethod] public void AddProduct(Product item) { products.Add(item); // 特に意味のあるコードではない } [WebMethod] public void AddProducts(Product[] items) { foreach (var item in items) { products.Add(item); } } [WebMethod] public void UpdateProduct(int productId, string name, decimal price) { // do nothing } } public class Product { public int ProductId { get; set; } public string Name { get; set; } public decimal UnitPrice { get; set; } } }
1.3 クライアント html ファイルの作成
作成した Webサービスを呼び出す html ファイルを作成します。新しい項目の追加画面で HTML ページ を選択してファイルを作成します。ここでは 名前を index.html としています。
html ファイルを次のように編集します。
<!DOCTYPE html> <!-- IE8以上 標準モードで動作させることが前提 --> <!-- Quirks(クアークス)モードで動作させる場合は json2.js がJSON.stringify/parse メソッドを使用するのに必要 --> <html lang="ja"> <head> <title>ASMX jQuery Integration Sample</title> <script src="Scripts/jquery-1.8.1.js" type="text/javascript"></script> <script type="text/javascript"> (function ($) { $(function () { // Getで取得するテスト $.ajax({ type: "Get", datatype: "json", url: "ProductService.asmx/RetrieveAllProduct", data: null, contentType: "application/json; charset=utf-8", // beforeSend: function (xhr) { // xhr.setRequestHeader("Accept", "application/json") // }, success: function (data, textStatus, xhr) { // data.d のように プロパティd経由でデータにアクセスする for (var i = 0; i < data.d.length; ++i) { $("#list").append(data.d[i].ProductId).append(data.d[i].Name).append(data.d[i].UnitPrice); $("#list").append("<br>"); } }, error: function (xhr, textStatus, errorThrown) { alert(xhr.responseText); } }); $("#retrieveByNameBtn").click(function () { var obj = new Object(); obj.name = "Car"; var arg = JSON.stringify(obj); $.ajax({ type: "Post", datatype: "json", url: "ProductService.asmx/RetrieveProductByName", data: arg, contentType: "application/json; charset=utf-8", success: function (data, textStatus, xhr) { if (data != null) { $("#list").append(data.d.ProductId).append(data.d.Name).append(data.d.UnitPrice); $("#list").append("<br>"); } }, error: function (xhr, textStatus, errorThrown) { alert(xhr.responseText); } }); }); $("#addBtn").click(function () { var obj = { item: { Name: "NewName", ProductId: 100 } }; var arg = JSON.stringify(obj); $.ajax({ type: "Post", datatype: "json", url: "ProductService.asmx/AddProduct", data: arg, contentType: "application/json; charset=utf-8", beforeSend: function (xhr) { xhr.setRequestHeader("Accept", "application/json") }, success: function (data, textStatus, xhr) { alert("Added"); }, error: function (xhr, textStatus, errorThrown) { alert(xhr.responseText); } }); }); $("#addMultipleBtn").click(function () { var obj = { items: new Array(2) }; obj.items[0] = { Name: "NewName1", ProductId: 201, UnitPrice: 30 }; obj.items[1] = { Name: "NewName2", ProductId: 202, UnitPrice: 33 }; // 互換モードの場合は json2.js が必要 var arg = JSON.stringify(obj); $.ajax({ type: "Post", datatype: "json", url: "ProductService.asmx/AddProducts", data: arg, contentType: "application/json; charset=utf-8", success: function (data, textStatus, xhr) { alert("Added"); }, error: function (xhr, textStatus, errorThrown) { alert(xhr); } }); }); $("#updateBtn").click(function () { // 手動でjson形式の文字列を設定する場合 var arg = '{ "productId" : "20" , "name" : "UpdatedName" , "price":"20.0"}'; $.ajax({ type: "Post", datatype: "json", url: "ProductService.asmx/UpdateProduct", data: arg, contentType: "application/json; charset=utf-8", beforeSend: function (xhr) { xhr.setRequestHeader("Accept", "application/json") }, success: function (data, textStatus, xhr) { alert("Updated"); }, error: function (xhr, textStatus, errorThrown) { alert(xhr); } }); }); }); } )(jQuery); </script> </head> <body> <div id="list"> </div> <input type="button" id="retrieveByNameBtn" value="検索" /> <input type="button" id="addBtn" value="追加" /> <input type="button" id="addMultipleBtn" value="複数追加" /> <input type="button" id="updateBtn" value="更新" /> </body> </html>
ボタンをクリックすると ProductService.asmx の各メソッドを呼び出すようにしています。サンプルソースやデータをキャプチャして確認してもらえればわかりますが、Webサービスの結果を取得するさいに、 d プロパティをつけて実際の値にアクセスする必要があります。
互換モードで動作させる場合は JSON.stringify メソッドが存在しないので json2.js を別途ダウンロードして ページに含めるようにしてください。
2. 動作確認
Web アプリケーションをデバッグ実行して index.html を表示します。 検索ボタンをクリックすると RetrieveAllProduct が呼び出されます。
追加ボタンで 一覧の最後にデータが追加されます。 そのほか、 複数追加、更新ボタンを押すと Webサービスのメソッドが呼び出されます。
3.まとめ
説明は以上です。jQuery を使用して WCF サービスや ASP.NET Webサービス を統合できます。
さんのコメント: さんのコメント: