連載
» 2006年05月27日 00時00分 公開

Windows Communication Foundation概説:WCFプログラミングの基礎 (1/3)

次期コミュニケーション技術「WCF」の最重要概念“ABC”は、どのように実装されるのか? 具体的な実装方法を解説。

[伊藤英豪,マイクロソフト株式会社]
Windows Communication Foundation概説
Insider.NET

 

「Windows Communication Foundation概説」のインデックス

連載目次

 前回はWCFの基本的な概念を説明した。今回はプログラミングやコンフィグレーションといったいわば実装手段を見ていく。今回のサンプル実装を通じて前回説明したWCFの概念がどのように実装されていくのかを理解していただければ幸いである。

 なお、ここに記載した内容は製品出荷前の現段階(2006 February CTP段階)での内容であるため将来変更される可能性が十分あることをあらかじめご了承いただきたい。本稿ではVisual Studio 2005とWinFX February CTPをインストールした環境でプログラミングを行っているが、すでにWinFX Beta2のダウンロードが可能となっている。最新のベータ版のダウンロードおよびインストール手順に関しては、下記サイトを参照していただきたい。

1. サービスの実装

さて、前回までの内容でエンドポイントを構成するABC(A:Address、B:Binding、C:Contract)に関して大まかに理解していただけたのではないだろうか。実際のプログラミングあるいはコンフィグレーションではこのABCの3要素を定義することになる。それでは具体的なサービスの実装に関して順を追って見ていこう。

 サービスを実装する手順としてはおおむね下記のようになる。

  1. サービス・インターフェイスの定義
    サービス・コントラクト、オペレーション・コントラクト、データ・コントラクト(あるいはメッセージ・コントラクトなど)の定義
  2. サービス実装クラスの実装
  3. サービス・ホストの実装

1-1. サービス・インターフェイスの定義

 Visual Studio 2005を起動し、メニュー・バーから[ファイル]−[新規作成]−[Webサイト]を選択し、そこで表示されるテンプレート一覧から「WinFX Services」を選択する(ここでのサービスの作成方法は、IIS 5.1または6.0でのホスティングの方法となる。詳細は後述する)。

WinFX Servicesテンプレートの選択

 「WinFX Services」テンプレートを選択して新規Webサイトを作成すると、そのプロジェクト・テンプレートが展開されてひな型のコードが現れる。本稿の例では、「App_Code」フォルダ内に自動作成された「Service.cs」ファイル内にひな型コードが次の画面のように追加された。

自動生成されたWinFX Servicesのひな型コード(Service.cs)

 その後、ディレクトリ「App_Code」を選択し、マウス右クリックで[新しい項目の追加]を選択し、テンプレート一覧から「クラス」を選択してクラス・ファイル(本稿の例では「SampleContract.cs」という名前のファイル)を新規に追加する。

[新しい項目の追加]から「クラス」を選択
この例では「SampleContract.cs」という名前のファイルを新規作成している。

 ここで、新規作成したクラス・ファイル内に、WCFサービスのサービス・コントラクトおよびオペレーション・コントラクトを下記のように記述する。また、交換するデータに関してもデータ・コントラクトを下記のように定義する。

using System.ServiceModel;
using System.Runtime.Serialization;

// サービス・コントラクトの定義
[ServiceContract(Namespace = "http://www.sample.com/SampleService/")]
public interface IMyService
{
  // オペレーション・コントラクトの定義
  [OperationContract]
  Product GetData();
}

// データ・コントラクトの定義
[DataContract(Name = "Product",
  Namespace = "http://www.sample.com/SampleService/Product")]
public class Product
{
  [DataMember(Name = "ProductID", IsRequired = true, Order = 0)]
  private int m_productID;
  [DataMember(Name = "ProductName", IsRequired = true, Order = 1)]
  private string m_productName;
  [DataMember(Name = "UnitPrice", IsRequired = true, Order = 2)]
  private decimal m_unitPrice;
  [DataMember(Name = "Discontinued", IsRequired = false, Order = 3)]
  private bool m_discontinued;

  public int ProductID
  {
    get { return m_productID; }
    set { m_productID = value; }
  }

  public string ProductName
  {
    get { return m_productName; }
    set { m_productName = value; }
  }

  public decimal UnitPrice
  {
    get { return m_unitPrice; }
    set { m_unitPrice = value; }
  }

  public bool Discontinued
  {
    get { return m_discontinued; }
    set { m_discontinued = value; }
  }
}

サービス・コントラクト、オペレーション・コントラクト、データ・コントラクトを定義するコード

1-2. サービス実装クラスの実装

 先ほどインターフェイスとして定義したサービス・コントラクトおよびオペレーション・コントラクトの実装を、インターフェイスを継承したクラスで行う。具体的には自動生成されているService.csファイルの中身を下記に変更する。

using System;
using System.ServiceModel;

// サービス・コントラクトを実装するサービス・クラス
public class MyService : IMyService
{
  public Product GetData()
  {
    Product product = new Product();
    product.ProductID = 1;
    product.ProductName = "商品A";
    product.UnitPrice = 1000;
    product.Discontinued = false;
    return product;
  }
}

サービス・コントラクトおよびオペレーション・コントラクトを実装するコード(Service.cs)

1-3. サービス・ホストの実装(IISへのホスティングの場合)

 すでに基本的なコンフィグレーションはWeb.configに記述されており、この段階でサービスをテスト実行することが可能である。試しにいったんWebサイトをビルドし、デバッグ実行させてみる。その後、表示されるディレクトリおよびファイル一覧から、Service.svcのリンクをクリックする。そうすると、下記のようなWCFサービスの簡単な説明とWSDLを表示させるページが表示される。

WCFサービスのヘルプ画面
新規作成したWebサイトの「Service.svc」のリンクをクリックしたところ。

 通常、HTTPをトランスポートとするサービスの場合は、テスト段階ではこのようにWebサービスのヘルプ画面を表示させることで動作が可能な状態にあるかどうかを確認することが可能である。なおこのヘルプ画面やWSDLの表示画面はコンフィグレーションの設定により非表示にできる(<metadataPublishing>タグで制御)。

 ここまでのところでサービス・コントラクト、オペレーション・コントラクト、およびデータ・コントラクトの記述を行ってきたが、A/B/Cのうち、BとCはどこにも記述されていないように見える。しかし実際は、この2つは下記の自動生成されたコンフィグレーション・ファイルに記述されている。

<?xml version="1.0"?>
<configuration
  xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <system.serviceModel>
    <services>
      <service
        name="MyService"
        behaviorConfiguration="returnFaults">
        <endpoint
          contract="IMyService"
          binding="wsHttpBinding"/>
      </service>
    </services>
    <behaviors>
      <behavior
        name="returnFaults"
        returnUnknownExceptionsAsFaults="true" />
    </behaviors>
  </system.serviceModel>

  <system.web>
    <compilation debug="true"/>
  </system.web>

</configuration>

BindingとContractの内容が記述されているコンフィギュレーション・ファイル(Web.config)

 ここで、WCF関連の定義自体は、<system.serviceModel>タグ中に記述し、サービスとしての定義を複数の<service>タグとして<services>タグの中に記述していく。ここでは1つのサービス定義のみが存在し、そこで、サービス名とエンドポイントを定義していく。エンドポイントは<endpoint>タグであり、その中で、address属性/contract属性/binding属性(いわゆる“ABC”)を定義していく。

 順に見ていこう。まずアドレス(address)であるが、ここではIISホスティング・パターンであるため、addressはデフォルトではこのWCFサービスのアドレスである、

http://localhost:2314/WinFxService1/Service.svc

となるため、記載されていない*

* ここではポート番号が入っているが、これは、開発専用の簡易Webサーバが割り当てた未使用のポート番号をそのまま使用しているためでる。本来、IISに正式にホスティングする際は適切に設定する必要がある。


 IISにホストする場合、仮にアドレスを記載するとしても下記のように「""」といった省略表現が可能である。

<endpoint
  address=""
  contract="IMyService"
  binding="wsHttpBinding"/>

 アドレスをきちんと指定する必要があるのは主として後述するセルフ・ホストの場合であるといえる。

 次にコントラクト(contract)であるが、ここで指定するのはサービス・コントラクトとして定義しているインターフェイス名となる。従って、ここでは“IMyService”を指定している。

 最後にバインディング(binding)であるが、ここでは標準提供のバインディング・セットである“wsHttpBinding”がデフォルトで指定されている。つまり、WinFX Servicesテンプレートで展開される標準のひな型コードでは、WS-*(Webサービス拡張仕様)に対応したバインディングが適用されることになる。

 さて、もう1つ重要なファイルが存在しているのを忘れてはならない。それは、自動生成されている「Service.svc」である。これは何だろうと中身を見てみると以下のようになっている。

<% @ServiceHost Language=C# Debug="true"
  Service="MyService" CodeBehind="~/App_Code/Service.cs" %>

 Service.svcは、IISにホストさせる場合に必要な、エントリポイントとなるファイルであり、ここにはサービス実装クラスのクラス名や、コードビハインド・ファイルのパスやファイル名が記載されている。つまり、ASP.NET Webサービスでの.asmxファイルのような存在である。WCFのクライアントはこのファイルのURL(本稿の例では「http://localhost:2314/WinFxService1/Service.svc」)を参照することになる。

       1|2|3 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。