.NET Framework SDKで始める.NETプログラミング(前編)

11.Hello World展覧会(8) - Webアプリケーション -

デジタルアドバンテージ 遠藤孝信
2001/02/10

p.1 p.2 p.3 p.4 p.5 p.6 p.7 p.8 p.9 p.10 p.11 p.12

Webアプリケーション版Hello World

 最後は、今作成したWebサービスを呼び出し、結果をWebブラウザに返すWebアプリケーションを作成してみる。ただしこれには、若干の下準備が必要だ。まず、ネットワーク上にあるWebサービスと、それを呼び出すアプリケーション(今回の場合はWebアプリケーション)との間を取り持つプロキシ・クラスが必要となる。プロキシ・クラスは、Webサービスの呼び出し時に必要なパラメータなどをSOAPのメッセージにしてサーバに送信し、返ってきたXMLのメッセージを取得してアプリケーションに渡すためのものだ。プロキシ・クラスの役割については、別稿の「特集:.NET Framework入門」が詳しいのでそちらを参照されたい。

 ただし、プロキシ・クラスは、.NET SDKに付属するツールで自動生成でき、Webサービスを呼び出すのにSOAPやXMLの知識はまったく必要ない。あらかじめプロキシ・クラスをDLLファイルにコンパイルして配置しておくだけだ。

 HelloServiceのためのプロキシ・クラスは、WebServiceUtil.exeを使用して、以下の手順で自動生成することができる。この際デフォルトでは、C#のコードが生成される。

WebServiceUtil /c:proxy /path:http://localhost/sdk/helloservice.asmx?SDL /out:HelloService.cs /n:HelloService

 最後の“/n:”オプション(/namespace:の省略形)は、出力されるプログラムのネームスペースを指定するものである。以下のリストは、上記のコマンドにより生成されたHelloService.csであるが、コード全体が「namespace HelloService」により構造化されているのが分かる。このようにプログラムでも独自のネームスペースを作成することができる。Webアプリケーションからは、このネームスペースを指定することによって、それに含まれているクラス(プロキシ・クラス)を識別し、呼び出すことができる。

//-----------------------------------------------------------------
/// <autogenerated>
///     This class was generated by a tool.
///     Runtime Version: 1.0.2204.21
///
///     Changes to this file may cause incorrect behavior and will
///     be lost if the code is regenerated.
/// </autogenerated>
//-----------------------------------------------------------------

namespace HelloService {
    using System.Xml.Serialization;
    using System.Web.Services.Protocols;
    using System.Web.Services;


    public class HelloClass
        : System.Web.Services.Protocols.SoapClientProtocol {
        public HelloClass() {
            this.Url = "http://localhost/sdk/helloservice.asmx";
        }

        [System.Web.Services.Protocols.SoapMethodAttribute
                            ("http://tempuri.org/HelloService")]
        public string HelloService() {
            object[] results
                    = this.Invoke("HelloService", new object[0]);
            return (string)(results[0]);
        }
        public System.IAsyncResult BeginHelloService(
            System.AsyncCallback callback, object asyncState) {
            return this.BeginInvoke("HelloService",
                        new object[0], callback, asyncState);
        }
        public string EndHelloService(
            System.IAsyncResult asyncResult) {
            object[] results = this.EndInvoke(asyncResult);
            return (string)(results[0]);
        }

    }
}

 WebServiceUtil.exeツールにより自動生成されたプロキシ・クラスのソースコードに4つあるメソッドのうち、2番目のHelloServiceメソッドが、先ほどのWebサービスとして記述したHelloServiceメソッドの代理、つまりプロキシとなる。

 こうしてHelloService.csを生成したら、次はこれを以下のようにコンパイルして、HelloService.dllを作成する。“/t:”オプション(/target:の省略形)で“library”と指定することによって、DLLであるHelloService.dllが生成される。

csc /t:library /r:system.WebServices.dll
/r:system.xml.serialization.dll HelloService.cs

 Webアプリケーションが外部のDLLファイルを使用する場合には、それらのDLLファイルをWebアプリケーションがあるディレクトリ内のbinディレクトリに配置する必要がある。このため、Webアプリケーション用ディレクトリ以下にbinディレクトリを作成し、生成されたHelloService.dllをこのbinディレクトリにコピーしてやっと準備は完了である。

mkdir bin
copy HelloService.dll

 前置きが長くなってしまったが、次にHello World Webサービスを呼び出すWebアプリケーションのC#言語スクリプトを示す。ASP.NETでのスクリプト・ファイルの拡張子は「.aspx」なので、作成したスクリプトはasphello.aspxというファイル名で保存する。

 1: <%-- asphello.aspx --%>
 2:
 3: <%@ Import Namespace="HelloService" %>
 4:
 5: <script language="C#" runat="server">
 6:  public void Page_Load(Object sender, EventArgs E)
 7:  {
 8:   HelloClass service = new HelloClass();
 9:   Result.Text = service.HelloService();
10:  }
11: </script>
12:
13: <html>
14:  <asp:Label id="Result" runat="server"/>
15: </html>
Webアプリケーション版Hello Worldのソースコード
  1: ASP.NETスクリプトのコメントは“<%--”と“--%>”で記述する。
  3: ネームスペースの指定。先ほどプロキシ・クラスに付けたものを指定する。
  5: scriptタグ内のコードがC#で記述されていることを指示し、このスクリプトがサーバ・サイドで実行されるように指定する。
  6: Page_Loadメソッドは、ページがロードされるときに1度だけ呼び出される。
  8: HelloClassのインスタンスを生成する。プロキシ・クラスの介在により、Webサービスのクラスを直接使用しているような記述ができる。
  9: Webサービスとして公開したメソッドを呼び出す。そしてメソッドが返した文字列をページ内のラベル・コントロールのTextプロパティに代入する。
  14: ブラウザ上に文字列を表示するためのラベル・コントロール。これはWebコントロールと呼ばれるものの1つで、使用しているブラウザに適切なhtmlのコードがサーバ・サイドで展開される。

 3行目で指定しているネームスペースは、先ほどプロキシ・クラスに付けたものである。このImportディレクティブにより、binディレクトリに置いたHelloService.dllで定義されているクラスHelloClassを直接使用することができる。C#の“using”と同じだ。ASP.NETでは、Systemなど基本的なネームスペースはデフォルトで取り込まれる。

 ASP.NETではページがロードされるときに1度だけPage_Loadメソッドが呼び出される。今回のプログラムでは、このタイミングでWebサービスを呼び出し、戻り値として与えられる文字列(“Hello Web Service World!”)を出力している(6〜11行目)。ここでは文字列を表示するためにWebコントロールの1つであるラベル・コントロールを使用しているが、これについても別稿の「特集:.NET Framework入門」で少し解説している。

 Webサービスと同様に、このスクリプトもIISの仮想ディレクトリに配置し、Webブラウザから呼び出して(表示して)実行する。

Webアプリケーション版Hello Worldを実行したところ
IISの仮想ディレクトリに配置したWebアプリケーションのスクリプト・ファイル(.aspxファイル)をWebブラウザで表示し実行する。するとWebアプリケーションが前述のWebサービス(Webサービス版Hello World)を呼び出し、戻り値として得た文字列(“Hello Web Service World!”)をブラウザに戻す。今度は文字列だけが正しく表示されていることが分かる。

 以上で本稿の前編は終わりである。後編では、.NET SDKに含まれている各種ツールやドキュメント、サンプル・プログラム、チュートリアルについて解説する予定だ。End of Article

関連記事(Insider.NET内)
特集
.NET Framework入門
Insider's Eye
Visual Studio.NETベータ1日本語版の入手法を総括する
関連リンク
マイクロソフトの.NET Framework SDKベータ1 日本語版のダウンロード・ページ
.NET Framework SDKベータ1(英語版)のダウンロード・ページ
IEのホームページ
Microsoft Data Access Components (MDAC) 2.6 RTM (2.60.6526.3) 日本語版 ダウンロード・ページ
最新障害情報ページ
 
 

 INDEX
  [特集] .NET Framework SDKで始める.NETプログラミング(前編)
    1..NET Framework SDKとは?
    2..NET Framework SDKをインストールする前に
    3..NET SDKのインストール
    4.Hello World展覧会(1)
    5.Hello World展覧会(2) - C# -
    6.Hello World展覧会(3) - VB.NET,JScript.NET -
    7.Hello World展覧会(4) - マネージド C++ -
    8.Hello World展覧会(5) - MSIL -
    9.Hello World展覧会(6) - Windows Forms -
   10.Hello World展覧会(7) - Webサービス -
 11.Hello World展覧会(8) - Webアプリケーション -
 
  [特集].NET Framework SDKで始める.NETプログラミング(後編)

 



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 記事ランキング

本日 月間