CodeZine(コードジン)

特集ページ一覧

Visual Studio 2008で標準搭載されたWindows Communication Foundation

Visual Studio 2008 徹底入門 (7)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/04/25 00:00
目次

サンプル1:SOAPスタイルのWebサービス

 まず最初にWCFのデフォルトである、SOAPスタイルのWebサービスのサンプルから作成しましょう。

 今回のサンプルでは、入力された文字列に挨拶メッセージを返すGetMessageと、ID・名前・住所を持つアドレス帳のエントリを返すGetAddressBookEntryの2つのサービスを提供します。サービス内容はシンプルなものですが、どのようにサービスを公開することができるのか、WCFを使った流れを把握しましょう。

プロジェクトの作成

 Visual Studio 2008を起動し、新しいプロジェクトを作成します。今回は[Visual C#]-[Web]カテゴリから[WCFサービス アプリケーション]を選択し、「WcfServiceTest」という名前でプロジェクトを作成します。

新しいプロジェクトの選択
新しいプロジェクトの選択

 新しいプロジェクトを作成すると、自動的にいくつかのファイルが作成されます。

自動生成されるファイル一覧(抜粋)
ファイル名 概要
IService1.cs 公開するサービスのインターフェイス定義。サービス・コントラクトとデータ・コントラクトが記されている。
Service1.svc 公開されるWCFサービスのエントリポイント。
Service1.svc.cs サービスの実装コード。IService1インターフェイスを実装したService1クラスが記されている。
Web.config XMLベースの設定ファイル。WCFで提供するサービスの設定が記されている。

 まず「Service1.svc」を見てみましょう。

Service1.svc
<%@ ServiceHost Language="C#" Debug="true"
    Service="WcfServiceTest.Service1" CodeBehind="Service1.svc.cs" %>

 内容はシンプルで、どのサービスを提供するかを定義しているだけです。今回は自動生成されたファイルにサービスを実装していきますので、このファイルは特に変更しません。このファイルがエントリポイントとなって、サービスを受け付けることになる、という点を押さえておきましょう。

コントラクトの定義

 では、最初にコントラクトを定義します。「IService1.cs」を開き、以下の内容に書き換えてください。

IService1.cs サービス・コントラクト定義
[ServiceContract]
public interface IService1
{
  [OperationContract]
  string GetMessage(string name);

  [OperationContract]
  AddressBookEntry GetAddressBookEntry(string id);
}

[DataContract]
public class AddressBookEntry
{
  int id;
  string name;
  string address;

  [DataMember]
  public int Id
    {
      get { return id; }
      set { id = value; }
    }

  [DataMember]
    public string Name
      {
        get { return name; }
        set { name = value; }
      }

  [DataMember]
    public string Address
      {
        get { return address; }
        set { address = value; }
      }
}

 外部に公開する2つのメソッドのインターフェイス定義と、そこで使用するデータに対して、属性を付加しています。各属性の意味はコントラクトの項で説明した通りです。

サービスの実装

 次に「Service1.svc.cs」を開き、サービスの実装コードを記します。

Service1.svc.cs
public class Service1 : IService1
{

  public string GetMessage(string name)
    {
      return string.Format("Hello {0}!", name);
    }

  public AddressBookEntry GetAddressBookEntry(string id)
    {
      int idvalue = int.Parse(id);
      AddressBookEntry entry;
      switch (idvalue)
        {
        case 1:
          entry = new AddressBookEntry() {
              Id = 1, Name = "Doi", Address = "Tokyo" };
          break;
        default:
          entry = new AddressBookEntry() {
              Id = 0, Name = "Anonymous", Address = "?" };
          break;
        }
      return entry;
    }
}

 実装自体は特別な内容ではなく、GetMessageメソッドは入力された名前にあいさつを付加した文字列を返し、GetAddressBookEntryメソッドはアドレス帳の項目を返します。本来であればGetAddressBookEntryメソッドには、データベースにアクセスするなどの処理が含まれることでしょう。実装クラスにWCFに依存した内容がまったく含まれないことに注目してください。

ABCの定義

 次に、このサービスで使用するABCの指定を行います。

 Web.configファイルを直接編集することもできますが、Visual Studio 2008にはMicrosoft Service Configuration Editorという、WCFの設定項目をGUIで編集するツールが付属していますので、これを利用することにしましょう。

 [ツール]-[WCF Service Configuration Editor]を選択し、[File]-[Open]よりWcfServiceTestプロジェクトのWeb.configファイルを開きます。

Microsoft Service Configuration Editorのデフォルトフォルダ
 Microsoft Service Configuration Editorを起動したら自動的にVisual Studio 2008で開いているプロジェクトの設定ファイルを読み込んでほしいところですが、現在のところはそこまでの連係は図られていません。また、「ファイルを開く」ダイアログのデフォルトフォルダも開いているプロジェクトとは無関係なフォルダが指定されます。
複数のプロジェクトでMicrosoft Service Configuration Editorを使用する場合、間違って異なるプロジェクトの設定ファイルを開かないよう注意してください。

 設定ファイルを開くと、次のような画面が表示されます。

WCFの設定内容
WCFの設定内容

 右下に2つのエンドポイントが表示されています。下はメタデータ取得のためにVisual Studio 2008が自動的に作成するエンドポイントですので無視してください。

 上のエンドポイントが今回使用するものです。

  • Addressは空
  • BindingはSOAPベースのbasicHttpBinding
  • ContractはWcfServiceTest.Iservice1インターフェイス

 となっています。今回は変更の必要はありませんので、[File]-[Exit]から終了させましょう。

サンプルの実行

 [F5]キーを押してサービスを実行してみましょう。最初に1回、デバッグを有効にするかどうかについてのダイアログが表示されますので、[OK]ボタンを押してください。

デバッグ有効/無効化ダイアログ
デバッグ有効/無効化ダイアログ

 Webブラウザが起動し、次のようなサービス画面が表示されるはずです。

Service1サービス ブラウザ画面
Service1サービス ブラウザ画面

 画面中のリンクをクリックすると、WebサービスのWSDL定義を閲覧することができます。この時点でWCFによるSOAPベースのWebサービスは完成し、クライアントのリクエストを受け付けることができます。実際にクライアントを作成してみましょう。

IISへのホスティング

 クライアント作成の前に、IISへのホスティングを行っておきます。これはASP.NET開発サーバではポート番号が不定のため、クライアントから接続するサービスを提供するには不都合なためです。

 WcfServiceTestプロジェクトの上で右クリックし、[発行]を選択します。

プロジェクトの発行
プロジェクトの発行

 「Webの発行」ダイアログで、右の[...]ボタンを押します。

「Webの発行」ダイアログ
「Webの発行」ダイアログ

 「Webサイトを開く」ダイアログで、左側の[ローカルIIS]をクリックします。右上の[新しいWebアプリケーションの作成]ボタンを押して新しいWebアプリケーション(ここではWcfTestとした)を作成し、[開く]ボタンを押します。

「Webサイトを開く」ダイアログ
「Webサイトを開く」ダイアログ

 「Webの発行」ダイアログで[発行]ボタンを押します。

「Webの発行」ダイアログ
「Webの発行」ダイアログ

 これでIISへのホスティングが完了しました。実際にアクセスして確かめてみましょう。

http://localhost/WcfTest/Service1.svc

 にアクセスし、先ほどと同じ画面が表示されることを確認してください。

Service1サービス ブラウザ画面
Service1サービス ブラウザ画面

クライアントの作成

 では、IISで公開されたWCFによるSOAPベースのWebサービスを、クライアントから呼び出してみましょう。SOAPベースのWebサービスはクライアントの種類を問いませんが、今回はWindows Formアプリケーションから呼び出してみます。

 [ファイル]-[追加]-[新しいプロジェクト]から[Visual C#]-[Windows]カテゴリの[Windowsフォーム アプリケーション]を選択し、新規プロジェクトを追加します。今回はプロジェクト名を「ClientTest」としました。

 Webサービスを呼び出すため、[プロジェクト]-[サービス参照の追加]から、先ほどのURIを指定して参照の追加を行います。

「サービス参照の追加」ダイアログ
「サービス参照の追加」ダイアログ

 左側のサービスペインでIService1を選択すると、右側に公開された操作が表示されます。[OK]ボタンを押すと、サービスを利用するための参照クラスが生成されます。

 フォームにボタンとラベルを配置し、ボタンをダブルクリックしてイベントハンドラを記述します。

クライアント フォーム
クライアント フォーム

 イベントハンドラ内で、WCFサービスを呼び出す処理を行います。

WCFサービス呼び出し処理
private void button1_Click(object sender, EventArgs e)
{
  ServiceReference1.IService1 service
      = new ServiceReference1.Service1Client();
  ServiceReference1.AddressBookEntry entry
      = service.GetAddressBookEntry("1");
  label1.Text = string.Format("ID={0} ,
      Name={1} , Address={2}", entry.Id, entry.Name, entry.Address);
}

 自動生成されたServiceReference1.Service1Clientクラスを使い、IService1インターフェイスを介して、IISでホスティングされているGetAddressBookEntryメソッドを呼び出し、結果をラベルに表示します。

 ClientTestプロジェクトをスタートアップ プロジェクトに指定し、[F5]キーを押して実行してみましょう。正しくサービスが公開されていれば、次のように、アドレス帳の項目が表示されるはずです。

WindowsフォームからのWebサービス呼び出し
WindowsフォームからのWebサービス呼び出し

 以上の手順でSOAPベースのWebサービスを作成し、呼び出しを確認することができました。ABCを適切に設定すれば、簡単にWebサービスを公開することができます。

 

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:Visual Studio 2008徹底入門

もっと読む

著者プロフィール

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト 土井 毅(ドイ ツヨシ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5