WCFを使ったサンプルの実装 4
残るはWCFサービスのホスティングです。
「Form1.cs」のフォーム上にボタンを配置し、WCFサービスをホスティングするイベントハンドラを記述します。イベントハンドラ部分のみ以下に示します。
using System.ServiceModel; using WCFMemberServiceLibrary; : :中略 : internal static ServiceHost myServiceHost = null; bool isServiceStarted = false; private void serviceButton_Click(object sender, EventArgs e) { if (!isServiceStarted) //WCFサービスが実行されていなければ { startService(); //WCFサービス開始 } else { stopService(); //WCFサービス終了 } } private void startService() { Uri baseAddress = new Uri("http://localhost:8080/MemberService"); myServiceHost = new ServiceHost(typeof(SampleService),baseAddress); myServiceHost.Open(); isServiceStarted = true; serviceButton.Text = "Stop Service"; } private void stopService() { if (myServiceHost.State != CommunicationState.Closed) { myServiceHost.Close(); isServiceStarted = false; serviceButton.Text = "Start Service"; } }
WCFサービスの開始・終了は、System.ServiceModel名前空間のServiceHost
クラスを用いて行います。ServiceHost
クラスの代表的なメソッド・プロパティを以下に示します。
メソッド・プロパティ名 | 概要 |
BaseAddressesプロパティ | サービスで使用するベースアドレスを表す |
Descriptionプロパティ | サービス概要を表す |
Stateプロパティ | サービスの通信状況を表す |
Abortメソッド | 現在の通信を中断してサービスを終了する |
AddServiceEndpointメソッド | サービスにEndpointを追加する |
Closeメソッド | 現在の通信終了後にサービスを終了する |
Openメソッド | サービスを開始する |
ここまで完成したらビルドし、「WCFMemberServiceGUI」プロジェクトをスタートアップ プロジェクトに指定して実行します。
[Start Service]ボタンをクリックすると、サービスが開始します。
実際にWCFサービスが動いていることを確認しましょう。以下のアドレスをWebブラウザで開くと、サービスについての説明が表示されます。
- http://localhost:8080/MemberService
上図にあるリンク、
- http://localhost:8080/MemberService?wsdl
をクリックすると、このサービスで使用するWSDLが表示されます。
これでWCFを使ったサービス提供側の実装は完了です。ホスティングアプリケーションを実行したまま、次のステップに進みましょう。
WCFSampleClientプロジェクトの実装
次に、クライアント側の実装を行いましょう。
もう1つVisual Studio 2005を起動し、新しいプロジェクトを作成します。今回は"コンソール アプリケーション"としてWCFSampleClientプロジェクトを作成します。
では、先ほどのWCFサービスからメタデータを取得してコントラクトを生成しましょう。
ソリューション エクスプローラの「WCFSampleClient」プロジェクトを右クリックし、[Add Service Reference...]を選択します。このメニューはVisual Studio 2005 Extensions for WCFによって追加された機能です。
[Service URI]に「http://localhost:8080/MemberService」を指定し、[OK]ボタンをクリックします。
ホスティングアプリケーションのWCFサービスからメタデータを取得し、自動的にクラスが作成されてソリューションエクスプローラに追加されます。
[Service References]-[localhost.map]-[localhost.cs]が新規に作成されます。このファイルには以下の定義が含まれています。
- データ・コントラクトで定義された
Member
クラス - サービス・コントラクトで定義されたISampleService
- ISampleServiceを実装し、通信処理を介したサービス呼び出しを行う
SampleServiceClient
クラス
クライアントでは、SampleServiceClient
クラスを使って実装を行います。
また、「app.config」ファイルも自動生成されています。指定されている「ABC」がサービス提供側と同じことに注目してください(ただしコントラクトの部分は自動生成されたクラスのインターフェイスを使用しています)。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> : :中略 : <client> <endpoint address="http://localhost:8080/MemberService"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService"
contract="WCFSampleClient.localhost.ISampleService"
name="BasicHttpBinding_ISampleService" /> </client> </system.serviceModel> </configuration>
Program.csのMain
メソッドに以下のコードを実装します。
using WCFMemberServiceLibrary; : :中略 : ISampleService client = new SampleServiceClient(); Member member1 = new Member(); member1.Id = 1; member1.Name = "Doi"; client.addMember(member1); Member member2 = new Member(); member2.Id = 2; member2.Name = "Yamada"; client.addMember(member2); Member member = client.getMember(1); Console.WriteLine(member.Name); Console.In.ReadLine();
ここでは、以下の処理を行っています。
- member1、member2という2人の会員を作成
addMember
メソッドで会員を追加getMember
メソッドで会員番号1の会員情報を取得- 取得した会員情報の名前をコンソールに出力
ビルドして実行すると、会員番号1の名前である「Doi」がコンソールに出力されるはずです。
まとめ
以上で、WCFサービスを使ったクライアント実装が完了しました。クライアント側の実装コードに、通信を意識した部分がほとんど無かったことに注目してください。
後編では今回作成したサンプルの通信方式をTCPに切り替えます。通信方式の切り替えにどのぐらいの作業が必要なのか、注目してください。また、今回はWCFサービスのホスティングに自作のGUIアプリケーションを使用しましたが、IISを使ってのホスティングについても扱う予定です。後編のためにも、前編で説明したWCFの概念、特に重要なキーワードである「ABC」についてはしっかりと理解してください。
それでは、次回「WCF(Windows Communication Foundation)チュートリアル 後編」もお楽しみに。