サンプル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」を見てみましょう。
<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceTest.Service1" CodeBehind="Service1.svc.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」を開き、サービスの実装コードを記します。
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を使用する場合、間違って異なるプロジェクトの設定ファイルを開かないよう注意してください。
設定ファイルを開くと、次のような画面が表示されます。
右下に2つのエンドポイントが表示されています。下はメタデータ取得のためにVisual Studio 2008が自動的に作成するエンドポイントですので無視してください。
上のエンドポイントが今回使用するものです。
- Addressは空
- BindingはSOAPベースの
basicHttpBinding
- Contractは
WcfServiceTest.Iservice1
インターフェイス
となっています。今回は変更の必要はありませんので、[File]-[Exit]から終了させましょう。
サンプルの実行
[F5]キーを押してサービスを実行してみましょう。最初に1回、デバッグを有効にするかどうかについてのダイアログが表示されますので、[OK]ボタンを押してください。
Webブラウザが起動し、次のようなサービス画面が表示されるはずです。
画面中のリンクをクリックすると、WebサービスのWSDL定義を閲覧することができます。この時点でWCFによるSOAPベースのWebサービスは完成し、クライアントのリクエストを受け付けることができます。実際にクライアントを作成してみましょう。
IISへのホスティング
クライアント作成の前に、IISへのホスティングを行っておきます。これはASP.NET開発サーバではポート番号が不定のため、クライアントから接続するサービスを提供するには不都合なためです。
WcfServiceTestプロジェクトの上で右クリックし、[発行]を選択します。
「Webの発行」ダイアログで、右の[...]ボタンを押します。
「Webサイトを開く」ダイアログで、左側の[ローカルIIS]をクリックします。右上の[新しいWebアプリケーションの作成]ボタンを押して新しいWebアプリケーション(ここではWcfTestとした)を作成し、[開く]ボタンを押します。
「Webの発行」ダイアログで[発行]ボタンを押します。
これでIISへのホスティングが完了しました。実際にアクセスして確かめてみましょう。
http://localhost/WcfTest/Service1.svc
にアクセスし、先ほどと同じ画面が表示されることを確認してください。
クライアントの作成
では、IISで公開されたWCFによるSOAPベースのWebサービスを、クライアントから呼び出してみましょう。SOAPベースのWebサービスはクライアントの種類を問いませんが、今回はWindows Formアプリケーションから呼び出してみます。
[ファイル]-[追加]-[新しいプロジェクト]から[Visual C#]-[Windows]カテゴリの[Windowsフォーム アプリケーション]を選択し、新規プロジェクトを追加します。今回はプロジェクト名を「ClientTest」としました。
Webサービスを呼び出すため、[プロジェクト]-[サービス参照の追加]から、先ほどのURIを指定して参照の追加を行います。
左側のサービスペインでIService1を選択すると、右側に公開された操作が表示されます。[OK]ボタンを押すと、サービスを利用するための参照クラスが生成されます。
フォームにボタンとラベルを配置し、ボタンをダブルクリックしてイベントハンドラを記述します。
イベントハンドラ内で、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]キーを押して実行してみましょう。正しくサービスが公開されていれば、次のように、アドレス帳の項目が表示されるはずです。
以上の手順でSOAPベースのWebサービスを作成し、呼び出しを確認することができました。ABCを適切に設定すれば、簡単にWebサービスを公開することができます。