ASP.NET AJAXで提供されるAJAX Web サービスブリッジ機能を利用すると、Webサービスやページメソッドのシグネチャからjavascriptからサービスを呼び出すためのプロキシをScriptManagerに作成させることができるので、クライアントスクリプトからのWebサービスを簡単に利用できるようになります。

動作環境

  • サーバ:Visual Studio 2008の組み込みコンテナ
  • クライアント: IE7.0 (サーバとクライアントは同一マシン)
  • 開発環境: Visual Studio 2008 Professional 英語版
  • .NET 3.5

1. プロジェクトの作成

空のソリューションを作成し、ASP.NET Webサイトプロジェクトを新規作成します。

1.1 Webサービスの作成

Webサイトプロジェクトを右クリック→[Add New Item]でAdd New Itemダイアログを表示します。TemplatesにWeb Serviceをセンタk水、WebServiceという名前でasmxファイルを新規作成します。asmxの中身を以下のように編集します。

<%@ WebService Language="C#" CodeBehind="~/App_Code/WebService.cs" Class="Test.WebService" %>

 次に、コードビハインドファイルWebService.csを編集します。既定で作成されるソースとの変更点は、以下の3点です。

  • namespaceにTestを設定
  • クラスにScriptServiceAttributeをアノテート
  • サービスメソッドGetDatasにScriptMethodAttributeをアノテート
using System;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Web.Script.Services;

namespace Test
{
    /// <summary>
    /// Summary description for WebService
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService]
    public class WebService : System.Web.Services.WebService
    {

        public WebService()
        {

            //Uncomment the following line if using designed components 
            //InitializeComponent(); 
        }
        [WebMethod]
        [ScriptMethod]
        public SearchResult GetDatas(string cond1, string cond2)
        {
            SearchResult result = new SearchResult();
            result.Result1 = cond1;
            result.Result2 = cond2;

            return result;
        }
        [Serializable]
        public class SearchResult
        {
            public string Result1 = "";
            public string Result2 = "";
        }
    }
}

1.2 Webフォームの編集

プロジェクトで作成される規定のDefault.aspx以下のように編集します。ScriptManagerの記述でServiceReferenceを設定し、Webサービスのパスを設定します。この設定により、Webサービスを呼び出すためのjavascriptのプロキシを作成してくれるようになります。

処理としてはボタンが押されたときにaction1()メソッドを呼び出します。action1メソッドでAJAX Webサービスを呼び出すプロキシオブジェクトを使用してGetDatasというWebサービスメソッドを呼び出しています。呼び出しが成功するとonSuccessというメソッドがコールバックされるので、結果をLabelに設定しています。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>

    <script type="text/javascript">
    function action1(){
        Test.WebService.GetDatas("条件1", "条件2", onSuccess, onFailed);
        
    }
    function onSuccess(results, context, methodName){
        $get("Label1").innerHTML = results.Result1;
        $get("Label2").innerHTML = results.Result2;
    }
    function onFailed(results, context, methodName){
        alert(results.get_Message());
    }
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
        <Services>
            <asp:ServiceReference Path="~/WebService.asmx" />
        </Services>
    </asp:ScriptManager>
    <div>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="javascript:action1(); return false;"/>
        <asp:Label ID="Label1" runat="server"></asp:Label>
        <asp:Label ID="Label2" runat="server"></asp:Label>
    </div>
    </form>
</body>
</html>

作成されるjavascriptのプロキシを確認することができます。
Webサービスasmxファイルのパスに/jsを追加したパスがjavascriptのプロキシファイルのパスとなります。asmxファイルへのパスがhttp://localhost/WebSite/WebService.asmxの場合は以下のようになります。 http://localhost:49181/WebSite/WebService.asmx/js

 解説は以上です。指摘、誤り等があればご連絡ください。