特集:Visual Studio 2008&ASP.NET 3.5

ASP.NETアプリ開発者のためのVisual Studio 2008新機能 Part IV

山田祥寛(http://www.wings.msn.to/
2008/04/11
Page1 Page2 Page3

Webサービス・ブリッジがWCFをサポート

 アプリケーションサービス・ブリッジがASP.NET標準のサービスにアクセスするための機能を提供するのに対して、アプリケーション開発者が自作したサービス・クラスを呼び出すための機能を提供するのが、Webサービス・ブリッジである。

 従来、ASP.NET AJAX 1.0のWebサービス・ブリッジ機能では、XML Webサービス(.asmxファイルで実装したWebサービス)にのみ対応していたが、ASP.NET 3.5ではWCF(Windows Communication Foundation)サービスとも連動することが可能になった。

 それではさっそく、具体的なサンプル・アプリケーションを見てみよう。以下は、WCFサービスとして提供される「Hello, World」サービス(与えられた値に対して、「こんにちは、●○さん!」というメッセージを返すサービス)を、ASP.NET AJAXから呼び出す例である。



図5 サンプル・アプリケーションの実行結果
テキストボックスに入力された値に対して、「こんにちは、●○さん!」というメッセージを出力する。

 なお、Webサービス・ブリッジ機能に関する基本的な事項については、別稿、

を、WCFについては、

も、それぞれ併せて参考にしていただきたい。

[1]ASP.NET AJAX対応のWCFサービスを作成する

 まずは、与えられた引数に応じて、「こんにちは、●○さん!」というメッセージを生成するWCFサービスを作成してみよう。

 もっとも、WCFサービスといって、何ら難しい手続きは必要ない。VS 2008では、ASP.NET AJAX対応のWCFサービスを作成するためのテンプレートが用意されており、WCFの動作に必要な設定からサービス・クラスに最低限必要な骨格までを自動生成してくれるからだ。まずは、ソリューション・エクスプローラのコンテキスト・メニューから[新しい項目の追加]を選択しよう。

図6 [新しい項目の追加]ダイアログ

 図6のような[新しい項目の追加]ダイアログが表示されるので、以下の表の要領で必要な情報を入力し、[追加]ボタンをクリックすればよい。

項目 入力/選択値
テンプレート AJAX対応WCFサービス
名前 HelloWorld.svc
言語 Visual Basic(またはVisual C#)
[新しい項目の追加]ダイアログ

 サービス・クラスの最低限の骨組みが自動生成されるので、以下のリスト3の要領で必要なコードを追記する(追記部分は白字)。ちなみに、ここではあらかじめ自動生成されているDoWorkという名前のメソッドを修正しているが、(もちろん)自分で新たなメソッドを追加することも可能だ。その場合にも、メソッドの先頭にOperationContract属性(System.ServiceModel名前空間)を付加するだけでよい。OperationContract属性は、メソッドが、WCFサービスを提供することを表すものである。

using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class HelloWorld {
  [OperationContract]

  public String DoWork(String name) {
    return String.Format("こんにちは、{0}さん!", name);
  }
}
Imports System.ServiceModel
Imports System.ServiceModel.Activation
Imports System.ServiceModel.Web

<ServiceContract(Namespace:="")> _
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)> _
Public Class HelloWorld

    <OperationContract()> _

    Public Function DoWork(ByVal name As String) As String
        Return String.Format("こんにちは、{0}さん!", name)
    End Function

End Class
リスト3 与えられた名前に対して、「こんにちは、●○さん!」というメッセージを生成するWebサービス(HelloWorld.svc。上:C#、下:VB)

 また、Webサービス・クラスを生成した後のWeb.configにも注目してみよう。以下のような設定コードが自動的に追記されているはずだ。取りあえず基本的なWCFサービスを動作させるだけならば、これらの設定コードを変更する必要はないはずなので、ここではリスト内のコメント(<!-- 〜 -->)でおおよその内容を概観するにとどめる。詳細については、前述した「連載:Windows Communication Foundation概説」の方を参照いただきたい。

<?xml version="1.0"?>
<configuration>
  ……中略……
  <system.serviceModel>

    <!-- ビヘイビア(サービスの挙動を表す情報)の登録 -->
    <behaviors>
      <endpointBehaviors>
        <behavior name="HelloWorldAspNetAjaxBehavior">
          <!--サービスへのASP.NET AJAXからのアクセスを有効化-->
          <enableWebScript/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

    <!-- 公開するサービスの定義 -->
    <services>
      <service name="HelloWorld">
        <!--
エンドポイント(サービスの提供口)の登録
  address属性(アドレス)はサーバ側で自動割り当てされるので省略
  behaviorConfiguration属性は<behavior>要素で定義されたビヘイビア名
  binding属性(データ形式)はAJAX利用の場合は"webHttpBinding"で固定
  contract属性(サービス)は、実際のWebサービス・クラス名に対応
        -->

        <endpoint
          address=""
          behaviorConfiguration="HelloWorldAspNetAjaxBehavior"
          binding="webHttpBinding"
          contract="HelloWorld"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>
リスト4 AJAX対応WCFサービスを動作させるための設定コード(Web.config)
[AJAX対応WCFサービス]テンプレートによって、自動生成されたコードを引用したもの。<!-- 〜 -->の部分は筆者によるコメントである。

[2]新規のWebフォームを作成する

 新規のWebフォーム(Wcf.aspx)を作成したら、フォーム・デザイナから以下の画面7の要領でサーバ・コントロールを配置する。また、それぞれのコントロールに対しては、下の表の内容でプロパティ値を設定しておこう。

図7 Webフォーム(Wcf.aspx)のレイアウト

コントロール(ID) プロパティ 設定値
ScriptManager(manager) Services HelloWorld.svc
TextBox(txtName) Size 10
Button(btnSend) OnClientClick return btnSend_Click()
Text 送信
Div(result)
各コントロールのプロパティで設定する内容

 WCFサービスにアクセスするための手続きは、XML Webサービスにアクセスする場合と同様、ScriptManagerコントロールのServicesプロパティを設定するだけだ。これによって、Webサービス・クラスにアクセスするためのプロキシ・クラス*5が自動生成される。

*5 プロキシ・クラスとは、その名のとおり、サービス・メソッドへのプロキシ(=代理)の役回りを担うものだ。プロキシ・クラスを介することで、クライアントサイド・スクリプトではあたかもローカルのライブラリにアクセスするかのように、サーバ側のWebサービスにアクセスできるというわけだ。

[参考]プロキシ・クラスのコード

 ASP.NET AJAXによって生成されるプロキシ・クラスの実コード(JavaScriptコード)を確認したい場合には、Webサービス・クラスのURLの末尾に「/js」を付与して呼び出せばよい。例えば、本サンプルの例であれば、以下のURLでプロキシ・クラスのコードを参照できる。

http://localhost:<ポート番号>/HelloWorld.svc/js

[3]サービス呼び出しのコードを記述する

 後は、[2]の手順によって自動生成されたプロキシ・クラスを介して、サービス・メソッドを呼び出すためのJavaScriptのコードを記述するだけだ。具体的なコードは以下のとおり。

<script type="text/javascript">

// [送信]ボタンクリック時に実行されるイベント・ハンドラ関数
function btnSend_Click() {

  // プロキシ・クラス経由でWCFサービスを呼び出し
  HelloWorld.DoWork(
    $get('txtName').value,

    // 成功コールバック(結果を<div>タグに反映)
    function(result){
      $get('result').innerHTML = result;
    }
  )
  return false;
}
</script>
リスト5 プロキシ・クラス経由でサービス・メソッドにアクセスするコード(Wcf.aspx)

 プロキシ・クラス呼び出しについても、XML Webサービス(.asmxファイル)にアクセスする場合と同様、以下の構文で記述できることを確認しておこう(詳細については、前述の別稿を参照されたい)。

クラス名.メソッド名(
  [パラメータ, ……]
  ,処理成功時に呼び出されるコールバック関数(成功コールバック)
  [,サービス側で例外が発生した場合に呼び出されるコールバック関数
    [,任意のコンテキスト値]
  ]
)
プロキシ・クラスの一般的な呼び出し構文

 以上を理解したら、さっそく、サンプル・アプリケーションを実行する。図5のように、入力値に応じてサービスが生成したメッセージが表示されれば成功だ。

 以上、今回はASP.NET 3.5本体における新機能の1つであるASP.NET AJAXについて紹介してきた。さまざまな新機能の中でも、(いわゆる「純粋な」新機能でないとはいえ)やはりASP.NET AJAXが標準機能として搭載されたことはうれしいポイントだろう。これまでは拡張ライブラリということもあって、ASP.NET AJAXの利用を見合わせてきたという開発者も、ASP.NET 3.5の登場によっていよいよちゅうちょする理由もなくなった。今後、ASP.NET AJAXの導入に一層の弾みがつくことを期待したいところだ。

 なお、余談ながら、最後に1つ追加情報を。読者の皆さんは、Part IでVS 2008のJavaScriptに対するIntelliSense機能は不完全であると説明したことを覚えているだろうか。そう、VS 2008初期バージョンでは、もっぱらASP.NET AJAX(厳密には、そのクライアント・フレームワークであるMicrosoft AJAX Library)をターゲットとしたものであり、(例えば)prototype.jsjQueryのような一部の外部ライブラリを正しく認識することができない。

 だが、心配することなかれ。先日、早くも登場したホットフィックスでは、ドキュメント・ウィンドウのパフォーマンスを改善するとともに、jQueryに対するIntelliSense機能が正しく動作するように修正されている。

 ちなみに、このようなホットフィックスは、今後も小まめにリリースされていくとのことであるから、そのほか主要なJavaScriptライブラリがVS 2008で正しく動作するようになる日も意外と近いかもしれない。

 リリースされてなおも改善と機能向上を続けるVS 2008から、まだまだ目が離せない。End of Article

 

 INDEX
  Visual Studio 2008&ASP.NET 3.5
  ASP.NETアプリ開発者のためのVisual Studio 2008新機能 Part I
    1.JavaScriptサポートを大幅に強化
    2.外部のJavaScriptライブラリやサービス・メソッドも認識可能
    3.サービス・メソッドを利用する場合/自作ライブラリにもツール・ヒントを表示
    4.機能強化されたJavaScriptのデバッグ機能
 
  ASP.NETアプリ開発者のためのVisual Studio 2008新機能 Part II
    1.CSSサポートもますます使いやすく(1)
    2.CSSサポートもますます使いやすく(2)
    3.マルチターゲッティング機能/分割ビュー
    4.マスタ・ページのネスト機能/エクステンダ・ウィザード
 
  ASP.NETアプリ開発者のためのVisual Studio 2008新機能 Part III
    1.新しいデータアクセス・コントロール − ListViewコントロール −(1)
    2.新しいデータアクセス・コントロール − ListViewコントロール −(2)
    3.より柔軟なページャの配置を可能にする − DataPagerコントロール −
    4.ASP.NETページでLINQ機能を利用する − LinqDataSourceコントロール −
 
  ASP.NETアプリ開発者のためのVisual Studio 2008新機能 Part IV
    1.UpdatePanelコントロールの適用範囲が拡大
    2.ロール・アクセスに対応したアプリケーションサービス・ブリッジ
  3.Webサービス・ブリッジがWCFをサポート


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間