→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属性に値が正しくセットされているかチェック。これが空の文字("")だとこのエラーが出る。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS