AJAXを説明してきました。それらの方法では、Webサービスを自分で作成する必要がありませんでした。ここでもう一度原点に返って、自分で作成したWebサービスを利用してAjaxを実現する方法について説明します。AJAXを利用すれば、これも驚くほど簡単です。AJAXを利用して作成します。†まずは、Webサービスの作成です。「.NETの機能を使用せずに、Ajaxを使用する方法」で紹介したWebサービスのクラスに、新たにScriptServiceAttribute属性を適用します。それ以外は、変更なしです。ファイル名は、"WebService.asmx"とします。GETでアクセスできるようにしましたが、その必要はありません。HTTPハンドラを登録する必要があります。Site」テンプレートを使用してプロジェクトを作成したのであれば、この設定はすでにされていますので、気にする必要はありません。次に、Webサービスを呼び出すページを作成します。前回との違いは、ScriptManagerコントロールを配置する点です。ScriptManagerのServicesプロパティに先ほど作成したWebサービスを追加します。ScriptManagerのScriptsプロパティにJavaScriptファイルを追加します。†この例では、Servicesプロパティに追加するServiceReferenceオブジェクトにはPathプロパティの値しか指定しておらず、InlineScriptプロパティはデフォルトのfalseのままとしました。InlineScriptプロパティがfalseのときは、後述するプロキシクラスを作成するJavaScriptを外部ファイルとして(<javascript>タグのscr属性に設定して)呼び出します。InlineScriptプロパティがtrueのときは、ページ内にJavaScriptが埋め込まれます。InlineScriptプロパティがtrueのときは、Pathプロパティは相対パスである必要があります。InlineScriptプロパティがfalseのときは、サーバーへの要求数が増えますが、ブラウザのキャッシュ機能が使われる可能性があり、trueのときは、ページのサイズが大きくなります。最後に、Webサービスを呼び出すJavaScriptを作成します。前回とほぼ同じ事を行っていますが、劇的にシンプルになることをご確認ください。Sys.Application.notifyScriptLoaded();loadイベントハンドラでは、DropDownList"PackageSizeList"のonchangeイベントハンドラを追加しています。AJAXでは$addHandlerを使って一発でできます。†onchangeイベントハンドラでWebサービスを呼び出しています。ご覧の通り、まるでWebサービスのメソッドをJavaScriptから直接呼び出しているかのように、Webサービスにアクセスできます。この例ではWebサービスのクラスに名前空間がありませんでしたが、名前空間がある場合は名前空間も付けて呼び出す必要があります(例えば名前空間が「MyNameSpace」であれば、「MyNameSpace.WebService.GetYoupackFee(...)」のように)。AJAXが自動的にプロキシクラスを作成してくれるからです。この例では、WebServiceクラスがプロキシクラスです。プロキシクラスにはWebサービスメソッドを呼び出すためのメソッドが作成されており、メソッドの名前は対応するWebサービスメソッドと同じです。プロキシクラスのメソッドのパラメータには、まず対応するWebサービスメソッドのパラメータを渡します。上記の例ではWebサービスメソッドのパラメータ数は1つだけですが、複数ある場合はその数だけ渡します。その次のパラメータには、Webサービスへの要求が成功したときに呼び出されるコールバック関数を指定します。上の例では、OnSucceeded関数がそれです。このパラメータは省略できます。その次のパラメータには、失敗したときに呼び出されるコールバック関数を指定します。上の例では、OnFailed関数がそれです。このパラメータも省略できます。上の例では省略しましたが、さらに次のパラメータに、ユーザーコンテキストを指定できます。ここで指定したコンテキストは、成功/失敗コールバック関数で取得できます。Webサービスメソッドがどこから呼び出されたのかを区別したいときなどに有用です。プロキシクラスのtimeoutプロパティに、タイムアウトの時間を設定することもできます。補足:成功コールバック関数、失敗コールバック関数、ユーザーコンテキストは、プロキシクラスのdefaultSucceededCallbackプロパティ、defaultFailedCallbackプロパティ、defaultUserContextプロパティに設定することもできます。成功コールバック関数では、Webサービスメソッドが返した値(resultパラメータ)、ユーザーコンテキスト(userContextパラメータ)、呼び出されたWebサービスメソッド名(methodNameパラメータ)を取得できます。失敗コールバック関数では、エラー情報をerrorパラメータで取得できます。これは、Sys.Net.WebServiceErrorオブジェクトです。エラーメッセージは、上記の例のように、messageプロパティで取得できます。†プロキシクラスは、Sys.Net.WebServiceProxyクラスから派生しています。クライアント側で呼び出すWebサービスのパスが直前まで分からないとき(ScriptManagerのServicesに登録されていないWebサービスを呼び出すとき)には、WebServiceProxyクラスを直接使ってWebサービスにアクセスすることができます。上記の例を改造して、ScriptManagerのServicesにWebサービスが登録されていないときに、WebService.GetYoupackFeeメソッドを呼び出すスクリプト(メソッドを呼び出す部分のみ)を以下に示します。60000);このようにWebServiceProxy.invokeメソッドでWebサービスメソッドを呼び出せます。3番目のパラメータは、Webサービスへの要求をGETで行うかを指定します。falseの場合はPOSTとなります。4番目のパラメータには、Webサービスに渡すパラメータを連想配列で指定します。7番目のパラメータはユーザーコンテキストです。8番目のパラメータはタイムアウト時間(単位はミリ秒)です。