CodeZine(コードジン)

特集ページ一覧

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

Visual Studio 2008 徹底入門 (7)

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

B:Binding

 「どのようにサービスを提供するか」を表すBはBinding(バインディング)の略で、データの表現形式を表します。

 例えば、同じHTTPプロトコルを使用する中でも、SOAPベースのWebサービスとRESTベースのWebサービスとJSONベースのWebサービスでは、同じデータを異なる表現形式で表すことになります。つまり、AddressだけではHTTPプロトコルだ、ということしか分かりませんので、それに加えて、HTTPプロトコル上でどのようにデータを表現するか、を表すのがこのバインディングです。

 WCFでは、次のようなバインディングが提供されています。

WCF標準のバインディング
バインディング名 概要
netTcpBinding TCP/IPを使用するバインディング
basicHttpBinding SOAPベースのWebサービスのBasic-Profileを使用するバインディング
wsHttpBinding Webサービス拡張仕様を使用するバインディング
netNamedPipeBinding 名前付きパイプを使用するバインディング
netMsmqBinding MSMQを使用してWCFコンポーネントと接続するためのバインディング
webHttpBinding RESTスタイルのWebサービスおよびJSONをサポートするWebプログラミングモデルのバインディング

 Visual Studio 2008でWCFを使ったプロジェクトを作成すると、SOAPベースのWebサービスを提供するbasicHttpBindingがデフォルトで使用されます。.NET Framework 3.5からサポートされたWebプログラミングモデルに対応するwebHttpBindingを使用すれば、RESTスタイルのWebサービスやJSONをサポートすることができます。

 なお、Webプログラミングモデルを使用する場合にはセキュリティに関する注意点があります。

 basicHttpBindingやwsHttpBindingなど、SOAPベースのBindingでは、WS-Securityを含むWS-*(Webサービス拡張仕様)に基づくセキュリティを使用することができます。しかし、SOAPを使用しないWebプログラミングモデルでは、SOAPヘッダーがないため、特別なセキュリティ情報を付加することができません。webHttpBindingを使ったWebプログラミングモデルの場合、AddressにHTTPSプロトコルを指定することで、暗号化のみを行うことができます。

C:Contract

 「何をサービスとして提供するか」を表すCはContract(コントラクト)の略で、実際にWCFを介してやり取りするデータを定義します。

 WCFのコントラクトには以下の2種類があります。

WCFのコントラクト
種類 概要
サービス・コントラクト サービスを提供するクラス・インターフェイスの定義
データ・コントラクト やり取りするデータについての定義
メッセージについてのコントラクト
 厳密には、WCFでやり取りするデータを定義するコントラクトには、データ・コントラクト以外にいくつかの方式(SOAPメッセージ構造を直接定義するメッセージ・コントラクトなど)があります。詳細はMSDNのドキュメントをご覧ください。

 コントラクトは、サービスを定義した.NETのクラス・インターフェイスに対し、属性として付加します。ここで重要な点ですが、コントラクトは通信方式やデータの表現形式には依存せず、公開するクラス・インターフェイス・メソッド・データがどれであるのか、WCFに通知する役割を担っています。

 今回のサンプルで使用するコントラクトを見てみましょう。最初はサービス・コントラクトですが、サービスを提供するIService1インターフェイスにServiceContract属性が、インターフェイス内の実際の操作を表すGetMessageメソッドにOperationContact属性がそれぞれ付加されています。WCFはServiceContract属性の付加されたクラス・インターフェイスを、サービスとして公開するクラス・インターフェイスとして、OperationContract属性の付加されたメソッドを実際のサービスとして認識し、外部に公開します。

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

 次に、データ・コントラクトを見てみましょう。intstringといった、.NET Frameworkの基本データ型については、特に定義することなく使用することができますが、独自のクラスについては、データをどのように受け渡す必要があるのかをWCFに通知する必要があり、これをデータ・コントラクトと呼びます。データ・コントラクトもサービス・コントラクトと同様に属性として表現します。

 以下のサンプルでは、独自のクラスであるAddressBookEntryクラスにDataContract属性が、受け渡す必要のあるデータであるId/NameプロパティにDataMember属性が付加されています。これにより、WCFはAddressBookEntryクラスのインスタンスがやり取りされる際に、そこに含まれるデータを適正に受け渡すことができます。

IService1.cs データ・コントラクト定義
[DataContract]
public class AddressBookEntry
{
  int id;
  string name;

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

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

・・・中略・・・

Bv:Behavior

 サービスの細かな挙動を表すBvはBehavior(ビヘイビア)の略です。WCFサービスのサーバ・クライアントで共有する必要がない、細かな設定情報が含まれています。

 複数のエンドポイントを含むサービス全体に対する設定を行う、サービス・ビヘイビアと、エンドポイントごとの設定を行う、エンドポイント・ビヘイビアが存在します。

E:Endpoint

 EはEndpoint(エンドポイント)の略で、ここまで説明したABC(+Bv)で構成されるサービスの提供口、ソケットのような概念を表します。

 WCFサービスを利用するクライアントは、このエンドポイントに対してサービスのリクエストを行います。つまり、

  • 通信先としてAで指定されたアドレスに
  • データ表現形式としてBで指定されたバインディングを使い
  • サービスの定義としてCで指定されたコントラクトに基づいて

 リクエストする、というわけです。

 このエンドポイントはサービス内に複数持つことができ、同じコントラクトに基づいて、異なるアドレス(通信方式)や、異なるバインディングを持つエンドポイントを同時に提供することもできます。

WCFの基本概念図
WCFの基本概念図

WCFのホスティング

 WCFはABC(+Bv)で構成されるエンドポイントをクライアントに向けて提供しますが、以下の2種類のホスティング形態を持っています。

  • アプリケーションによるホスティング
  • IISによるホスティング(開発時はVisual Studioの提供するASP.NET 開発サーバ)

 アプリケーションによるホスティングでもHTTPベースのWebサービスを提供することができますが、一般的な用途を考え、本記事ではIISによるWebサービスのホスティングを使用します。

ABC(+Bv)の指定方法

 エンドポイントを構成するABC(+Bv)のうち、C(コントラクト)については、ソースコード中に属性として記述することを既に解説しました。それ以外のAB(+Bv)については、以下の2種類の指定方法があります。

  • ソースコードで指定
  • XMLベースの設定ファイルで指定

 後者のXMLベースの設定ファイルは、.NET標準の構成ファイル(WindowsアプリケーションではApp.config、Webアプリケーションの場合はWeb.config)を使用します。本記事ではIISによるホスティングを使用しますので、ABCはWeb.configファイルで設定します。

 以下に実際の記述例を示します。

Web.configファイルにおけるABCの指定例
<configuration>
・・・中略・・・
  <system.serviceModel>
  <services>
   <service behaviorConfiguration="WcfServiceTest.Service1Behavior"
name="WcfServiceTest.Service1">
<endpoint address="" binding="basicHttpBinding"
bindingConfiguration=""
name="" contract="WcfServiceTest.IService1" />
</service> </services> <behaviors> <serviceBehaviors> <behavior name="WcfServiceTest.Service1Behavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>

 中ほどにあるendpoint要素のaddress/binding/contract属性が、それぞれABCを指しています。

 IISによるホスティングを使用する場合、アドレスはHTTPプロトコルベースで、IIS側で割り当てられます。ここではbinding属性にSOAPベースのWebサービスであるbasicHttpBindingを、contract属性としてServiceContract属性を付加した、先ほどのWcfServiceTest.IService1インターフェイスを指定しています。

 さて、前置きが非常に長くなりましたが、WCFの基本概念を押さえることができたでしょうか。WCFサービスのキーワードであるABCをしっかり押さえつつ、サンプル作成に入っていきましょう。

 

  • 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