→AJAX関連 →JavaScript →ASP.NET関連 #contents ※以下はASP.NET 2.0に ASP.NET AJAX Extensionをインストールして開発する場合の話 *関連Webサイト [#sf491611] -[[ASP.NET Ajax>http://ajax.asp.net/]] (Atlasと呼ばれていたもの) --[[Documentation & Tutorial>http://www.asp.net/ajax/documentation/]] --[[Online Document>http://www.asp.net/ajax/documentation/live/default.aspx]] --[[Online Document(日本語)@MSDN>http://msdn.microsoft.com/ja-jp/library/bb398822.aspx]] --http://www.asp.net/ajax/downloads/ --[[ASP.NET AJAX 1.0 download>http://www.microsoft.com/downloads/details.aspx?FamilyID=ca9d90fa-e8c9-42e3-aa19-08e2c027f5d6&displaylang=en]] ---Visual Studio .NET 2005 SP1をあらかじめ入れておくことが強く推奨されている --[[AJAX Control Toolkit>http://www.codeplex.com/AjaxControlToolkit/Release/ProjectReleases.aspx?ReleaseId=11121]] ---ASP.NET AJAX Control Toolkit は、ASP.NET AJAX コントロールとエクステンダを使用して作成できるエクスペリエンスを示す、サンプルとコンポーネントのコレクションです。 *Tutorial [#e05d3de0] -[[ASP.NET AJAX Control Toolkitを利用するには?>http://www.atmarkit.co.jp/fdotnet/dotnettips/561aspajaxprepare/aspajaxprepare.html]] --Control ToolkitはASP.NET AJAX本体には含まれていない。Control Toolkitで提供される各コントロールを利用するには、ASP.NET AJAX本体のインストールに加えて、Control Toolkitの動作に必要なファイルをアプリケーションに配置する必要がある。 -[[ASP.NET AJAXを実際に使用する手順>http://www.thinkit.co.jp/free/article/0702/14/4/]] -[[AtlasでのWebサービスの呼出し>http://koguma.cocolog-nifty.com/koguma/2006/05/atlasweb_9181.html]] -[[ASP.NET AJAXを使ってWebページを作成する>http://www.thinkit.co.jp/free/article/0702/14/3/]] -[[ASP.NET AJAXでリッチクライアントWebアプリケーションを作成する>http://codezine.jp/a/article/aid/1404.aspx]] -[[ASP.NET AJAXで学ぶAJAX対応コントロール実装の基本(前篇)>http://codezine.jp/a/article/aid/1544.aspx]] -[[ASP.NETとAJAXのサンプル集>http://www.friendlysw.com/aspnet/aspnet.asp]] -[[ASP.NET AJAXを使いこなす>http://www.atmarkit.co.jp/fdotnet/aspnetajax/aspnetajax02/aspnetajax02_01.html]] *動作モデル [#e453c64b] -クライアント中心モデル --クライアント中心モデルでは、JavaScriptで記述すると煩雑になるコードを簡潔に記述するためのJavaScriptライブラリ群であるMicrosoft AJAX Libraryを活用 -サーバ中心モデル --サーバ中心モデルは、JavaScriptコードを一切記述しないでAjaxアプリケーションを実現するための仕組み --JavaScriptコードは、ASP.NET AJAXのコントロールが生成するため、開発者はJavaScriptについて特に意識することなく開発することが可能 --サーバ中心モデルのアプローチは、2つの方式にに大きく分かれる ---ASP.NET 2.0 AJAX Extensionsを活用する方式 ---AJAX Control Toolkitを活用する方式 *System.Web.Extensionsが見つからないというエラーについて [#e7f9cb80] -サーバに発行したAJAXアプリが以下のようなエラーを出す場合 構成にエラーがあります。 説明: この要求を処理するために必要な構成ファイルの処理中にエラーが発生しました。 以下のエラーの詳細を確認し、構成ファイルに変更を加えてください。 パーサー エラー メッセージ: ファイルまたはアセンブリ 'System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、 またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが 見つかりません。 -これはサーバにASP.NET AJAX Extension をインストールしていないときに起きる。 -つまりサーバマシンに同Extensionのインストールが必要ってこと -参考URL:http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PageIndex=1&SiteID=7&PageID=1&PostID=1797196 ASP.NET AJAX Extensions は、ASPAJAXExtSetup.msi をセットアップすることで、 GAC([C:\WINDOWS\assembly])へ System.Web.Extensions.dll というアセンブリが インストールされますので、通常は Web アプリケーションの Bin フォルダへ コピーする必要はありません。 もし、この System.Web.Extensions.dll を Bin フォルダへコピーしたら アプリケーションが正常に動作したと言うことであれば、ASPAJAXExtSetup.msi の セットアップが正常におこなわれていない可能性があります。 一方、AJAX Control Toolkit は、AjaxControlToolkit.dll と各言語ごとの AjaxControlToolkit.resources.dll というアセンブリで構成されます。 このアセンブリは GAC にはインストールされませんので、 Web アプリケーションの Bin フォルダになければなりません。 *最初ただのASP.NETだったWebサービスに後からAJAX対応を追加したい場合 [#a8443665] -ASP.NET AJAXを使ってJavaScriptからWebサービスを呼び出すには''Webサービス側もASP.NET AJAXに対応させる必要があります''。 -Web.configに以下のタグ記述を追加する必要がある模様 -別のサイトを一つAJAXありで作ってそこのWeb.configからコピーするとよい --configuration/configSections(configurationタグ内の最初のタグでなくてはならない) --configuration/system.web/pages --configuration/system.web/compilation/assemblies --configuration/system.web/httpHandlers --configuration/system.web/httpModules --configuration/system.web.extensions --configuration/system.webServer -System.Web.Extensions.dllの参照を追加する必要がある -サービスのソースに以下のusingが必要 using System.Web.Script.Services; -サービスクラスに[ScriptService]属性を付ける必要がある -サーバにASP.NET AJAX自体のインストールが必須なのは言うまでもない -うまく追加できたかどうかは、サービスのURLの.asmxの後に /jsをつけて表示させてみる。プロキシのJavaScriptが表示されたらOKと見てよい -HelloWorldなWebサービスを作ってプロキシを表示させた例 var Service=function() { Service.initializeBase(this); this._timeout = 0; this._userContext = null; this._succeeded = null; this._failed = null; } Service.prototype= { HelloWorld:function(succeededCallback, failedCallback, userContext) { return this._invoke( Service.get_path(), 'HelloWorld',false,{}, succeededCallback,failedCallback,userContext ); } } Service.registerClass('Service',Sys.Net.WebServiceProxy); Service._staticInstance = new Service(); Service.set_path = function(value) { Service._staticInstance._path = value; } Service.get_path = function() { return Service._staticInstance._path; } Service.set_timeout = function(value) { Service._staticInstance._timeout = value; } Service.get_timeout = function() { return Service._staticInstance._timeout; } Service.set_defaultUserContext = function(value) { Service._staticInstance._userContext = value; } Service.get_defaultUserContext = function() { return Service._staticInstance._userContext; } Service.set_defaultSucceededCallback = function(value) { Service._staticInstance._succeeded = value; } Service.get_defaultSucceededCallback = function() { return Service._staticInstance._succeeded; } Service.set_defaultFailedCallback = function(value) { Service._staticInstance._failed = value; } Service.get_defaultFailedCallback = function() { return Service._staticInstance._failed; } Service.set_path("/AjaxTst/Service.asmx"); Service.HelloWorld= function(onSuccess,onFailed,userContext) { Service._staticInstance.HelloWorld(onSuccess,onFailed,userContext); } --http://server_name/AjaxTst/Service.asmx/js というURLで表示させた例。実際には改行はこんなふうには入っていません *ASP.NET AJAXからWebサービスを呼び出す [#i0dc8066] -[[JavaScriptからASP.NETのWebサービスを呼び出す>http://karua.at.webry.info/200702/article_24.html]] --[[(2)>http://karua.at.webry.info/200703/article_2.html]] -[[ASP.NET AJAXで作成されたプロキシにコメントをつけてみる>http://karua.at.webry.info/200703/article_3.html]] -[[クライアントサイド・スクリプトからXML Webサービスを非同期呼び出しするには?(クライアントサイド編)>http://www.atmarkit.co.jp/fdotnet/dotnettips/610aspajaxwebservice2/aspajaxwebservice2.html]] -[[クライアントサイド・スクリプトからXML Webサービスを非同期呼び出しするには?(サーバサイド編)>http://www.atmarkit.co.jp/fdotnet/dotnettips/607aspajaxwebservice1/aspajaxwebservice1.html]] -[[MSDNの説明>http://msdn.microsoft.com/ja-jp/library/bb515101.aspx]] **ひっかかりやすい注意点。FAQ的なこと [#k534b411] -呼び出す側のASP.NETのサイトと呼び出されるWebサービスは同じサーバー内にある必要があります。 -呼び出す側のASP.NETのサイトと呼び出されるWebサービスが同じディレクトリ内に無い場合、ScriptManagerに指定するURLは絶対パスである必要があります。たとえ同じサーバー内にあっても相対パス指定はできないので注意。(ヘルプにはできるかのように書いてありますが、ダメな模様) -呼び出す側も呼び出される側もASP.NET AJAXに対応させる必要があります。Web.configがちゃんと両方とも書きかわっているか確認して下さい -ASP.NET AJAXの拡張とWSE3.0の拡張は共存できるようです(同時に同じWebサービスで使える)両者ともWeb.configに設定が追加されますが、それらがマージされたような感じになります。 -サービス側を修正しないで呼ぶ方法も実はあるらしいのだが、未確認(2008.8.20) **プロキシクラス [#y039ced3] -プロキシクラスはサーバ(呼出側ではなく、サービス側)によって生成される -プロキシからの呼出は XMLHTTPオブジェクトを通じて非同期で行われる -プロキシは Sys.Net.WebServiceProxyクラス(ASP.NET AJAXで用意されているJavaScriptのクラス)から派生する **サービス側でやること [#n1efbb34] -System.Web.Extensions への参照を追加する -using System.Web.Script.Services; -Webサービス側のクラスに ScriptService属性をつける -Web.ConfigにScriptHandlerFactory HTTPハンドラを登録(AJAXテンプレからプロジェクトを作った場合は既に登録されている) -シリアル化のフォーマット指定(任意) --規定ではJSON --メソッドにScriptMethod属性で指定する [ScriptMethod(ResponseFormat.xml)] //XMLを指定 **クライアント側ASP.NETサイトでやること [#c58f2201] -呼び出すページに ScriptManagerを配置 -ServerReference子要素のpath属性にasmxのURLを指定。ただし、ここに指定できるのは呼び出す側と同じサイトにあるWebサービスのみ -ServerReference.Inline = trueのとき、プロキシクラスはページ内のインラインスクリプトとして生成される -ServerReference.Inline = trueのときは、違うディレクトリにあるWebサービスを呼ぶことはできない -ServerReferenceの設定はScriptManagerコントロールのプロパティから「Services」をクリックすると設定できる --ASP.NETのプログラムでも設定できる ScriptManager1.Services[0].Path = "http://xxx/hoge.asmx"; -呼出の結果はJavaScriptで成功コールバック、失敗コールバックを用意して処理する -Web.configに一連の設定があること。特に最初AJAX用に作ってなかったページを後から対応させるときは注意 *Path cannot be emptyという例外メッセージについて [#kfd362be] -ScriptManagerが'Path cannot be empty'という例外を出す場合は、ScriptManagerのServiceReference タグの Path属性に値が正しくセットされているかチェック。これが〜文字だとこのエラーが出る。 -ScriptManagerが'Path cannot be empty'という例外を出す場合は、ScriptManagerのServiceReference タグの Path属性に値が正しくセットされているかチェック。これが空の文字("")だとこのエラーが出る。