Partilhar via


【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.aspx

  • Anonymous
    April 21, 2007
    とは言え、ドーナツも侮れませんね。 タイムリーにも記事が掲載されていました。 <ドーナツ>米大手進出で「首都圏戦争」激化 高級品も登場 http://headlines.yahoo.co.jp/hl?a=20070421-00000082-mai-bus_all

  • Anonymous
    April 22, 2007
    こんにちは。 Futures CTP のドキュメントが少ない状態ですので(正式リリースではないのでご容赦ください)、以前、XML-Script のサンプルを掲載しましたが( こちら )、デベロッパーエバンジェリストの小高が、さらに、アドバンストなソースを公開しています。(以下)

  • Anonymous
    April 23, 2007
    松崎 剛 ブログ (Tsuyoshi Matsuzaki Blog) と こだかたろうです からです。 ASP.NET AJAX の XML-Script を使ったクライアントサイドのデータバインド その2