【ASP.NET AJAX】 XML-Scriptを使用したWebサービスの非同期呼び出し
こんにちは、こだかです。
昨日のクリクリドーナツは1時間40分待ち!、お店のデッキ(並ぶスペース)には人が入りきらなくて、タイムズスクエアに伸びる橋まで行列が出来ていました。(下図)
───────┐ │橋 │
│ │ │
お店 │ │・・・ │
│ │・・・ │
───────┴───┤・・・ │
デッキ │・・・ │
行列1 ・・・・・・ │行列2│
・・・・・・・・・・・・ │ │
───────────┘ └───────────────
道 こだか!
─────────────────────────────────
(ちなみにこの絵を書くのに10分近く掛っています。何をやってるのだか・・・崩れている人、ごめんなさい)
ウォッチャーのこだかとしては、写真を是非撮りたいと思っています。
さて、MicrosoftONでAJAXの話をする為に、色々準備をしていたのですが、
ASP.NET AJAXの情報は比較的多くある割に、XML-Scriptの情報が少ないように感じましたので、今日はXML-Scriptで非同期にWebServiceを呼ぶサンプルを掲載します。
実行すると、現在時刻をStringで返すWebServiceを呼び表示します。それだけのサンプルです。
比較の為、JavaScriptでの呼び出しも同じページに含めています。
(弊社松崎のブログもご確認下さい:https://blogs.msdn.com/tsmatsuz/archive/2007/03/12/xml-script-futures-ctp.aspx)
手順
1 VisualStudio2005を起動して[ファイル]→[新規作成]→[Webサイト]より[ASP.NET AJAX CTP-Enabled WebSite]を選択し新規のWebサイトを作成します。
2 Default.aspxのソースビューに下記を貼り付けます。
3 [Webサイト]→[新しい項目の追加]より[Webサービス]を選択しファイル名を[DateTimeService.asmx]とします。
4 DateTimeService.csに下記のWebサービスを貼り付けます。
これでビルドができるはずです。
(ここまでやるなら、サンプルのプロジェクトをそのままホストすればよかったですね・・・)
JavaScriptでそのまま書くと、"Button2_onclick","function OnComplete"辺りの記述になります。
一方XML-Scriptの同じ部分は <script type="text/xml-script">以下です。
この例だけで一概には言えませんが、XML-Scriptで書くと記述自体は多くなりますが、見た目に分かり易くなりますね。
もちろん、クライアントサイドで、Microsoft AJAX Libraryの組み込みコンポーネントが使用できるのも魅力です。
この例ではLabelコントロールを使用していますが、当然対応するHTMLタグは無いので、spanとして記述をしておきます。
ただクライアントサイドでの実装は、デバッグが面倒なのと、現状では情報が少ないので、ライブラリのソースの追跡は避けて通れません。
この辺りのハードルを下げることが、エバンジェリストの役目だと思います。
Default.aspx------------------------------------------------------------------------------------------------------
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<script language="javascript" type="text/javascript">
// <!CDATA[
function Button2_onclick() {
retVal = DateTimeService.GetTime(OnComplete);
}
function OnComplete(value) {
var projectElement1 = $find("lblJavaScript1");
projectElement1.set_text("JAVA-Scriptでの更新です");
projectElement1.get_element().style.backgroundColor="F00000";
var projectElement2 = $find("lblJavaScript2");
projectElement2.set_text(value);
}
// ]]>
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Assembly="Microsoft.Web.Preview" Name="PreviewScript.js" />
</Scripts>
<Services>
<asp:ServiceReference Path="DateTimeService.asmx" />
</Services>
</asp:ScriptManager>
<div>
<input id="Button1" type="button" value="XML-Script" />
<h1><span id="lblXML-Script1" ></span></h1>
<h1><span id="lblXML-Script2" ></span></h1>
</div>
<div>
<input id="Button2" type="button" value="JAVA-Script" onclick="return Button2_onclick()" />
<h1><span id="lblJavaScript1" ></span></h1>
<h1><span id="lblJavaScript2" ></span></h1>
</div>
<script type="text/xml-script">
<page xmlns="https://schemas.microsoft.com/xml-script/2005">
<components>
<label id="lblXML-Script1" />
<label id="lblXML-Script2" />
<label id="lblJavaScript1" />
<label id="lblJavaScript2" />
<button id="Button1">
<click>
<setPropertyAction target="lblXML-Script1"
property="text"
value="XML-Scriptでの更新です" />
<setPropertyAction target="lblXML-Script1"
property="element"
propertyKey="style.backgroundColor"
value="#FFFF00" />
<invokeMethodAction target="webServiceMethod" method="invoke">
<parameters userContext="" />
</invokeMethodAction>
</click>
</button>
<ServiceMethodRequest id="webServiceMethod"
url="DateTimeService.asmx"
methodName="GetTime"
useGet = "false">
<completed>
<setPropertyAction target="lblXML-Script2" property="text">
<bindings>
<binding dataContext="webServiceMethod"
dataPath="result"
property="value"/>
</bindings>
</setPropertyAction>
</completed>
</ServiceMethodRequest>
</components>
</page>
</script>
</form>
</body>
</html>
Webサービス-------------------------------------------------------------------------------------------------
using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
/// <summary>
/// DateTimeService の概要の説明です
/// </summary>
[WebService(Namespace = "https://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class DateTimeService : System.Web.Services.WebService {
public DateTimeService () {
//デザインされたコンポーネントを使用する場合、次の行をコメントを解除してください
//InitializeComponent();
}
[WebMethod]
public string GetTime()
{
return DateTime.Now.ToShortTimeString();
}
}
少し解説を加えると、下記<binding>ですが、それぞれプロパティの説明は以下になります。
<binding dataContext="webServiceMethod"
dataPath="result"
property="value"/>
dataContext:バインド元、今回の場合はWebサービス
dataPath:バインド元のどの情報を対象にするのか?今回はWebサービスの戻り値
property:バインド先のプロパティ
また、下記<ServiceMethodRequest>ですが、useGetはfalseにする必要があります。
こうしないとJSONのシリアライズがうまくできません。
<ServiceMethodRequest id="webServiceMethod"
url="DateTimeService.asmx"
methodName="GetTime"
useGet = "false">
以上です、間違った事を書いていたらごめんなさい。
こだかたろう
Comments
Anonymous
April 21, 2007
他エバンジェリストがOrcas Beta 1を紹介する中、自分はドーナツ・・・お恥ずかしいです。 Visual Studio コードネーム "Orcas" Beta 1のダウンロードは以下になります。 http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspxAnonymous
April 21, 2007
とは言え、ドーナツも侮れませんね。 タイムリーにも記事が掲載されていました。 <ドーナツ>米大手進出で「首都圏戦争」激化 高級品も登場 http://headlines.yahoo.co.jp/hl?a=20070421-00000082-mai-bus_allAnonymous
April 22, 2007
こんにちは。 Futures CTP のドキュメントが少ない状態ですので(正式リリースではないのでご容赦ください)、以前、XML-Script のサンプルを掲載しましたが( こちら )、デベロッパーエバンジェリストの小高が、さらに、アドバンストなソースを公開しています。(以下)Anonymous
April 23, 2007
松崎 剛 ブログ (Tsuyoshi Matsuzaki Blog) と こだかたろうです からです。 ASP.NET AJAX の XML-Script を使ったクライアントサイドのデータバインド その2