IISによるWCFサービスのホスティング
ここまでのサンプルでは、WCFサービスをWindowsフォームアプリケーションでホスティングし、サービスの開始・終了を行ってきました。
ただ、WCFサービスをWebサービスとして公開する場合には、独自のホスティングアプリケーションを使用するよりも、IISでホスティングする方が管理しやすい場合があるかもしれません。
ここからは、IISによるWCFサービスのホスティング方法について説明します。
IISでのホスティング方法
まず、Visual Studio 2005でASP.NETベースでのホスティングを行うプロジェクトを作成しましょう。[ファイル]-[新規作成]-[Webサイト]から、"WCF Service"というWCFサービスホスティング用のプロジェクトを追加します。
プロジェクトを作成すると、WCFサービスのホスティングのひな型があらかじめ準備されています。
まず、「Service.svc」というファイルですが、拡張子svcというファイルはASP.NETでWCFサービスをホスティングする際のエントリポイントです。このファイルのURLがWCFサービスを提供する際の"ABC"のA(Address)となります。
このファイルの内容は次のとおりです。
<% @ServiceHost Language=C# Debug="true" Service="MyService"
CodeBehind="~/App_Code/Service.cs" %>
これは構成ファイルでMyServiceとして定義されたサービスをホスティングする、という意味です。ASP.NETプロジェクトの構成ファイルである「Web.config」にはMyServiceというサービスが定義されており、「App_Code/Service.cs」のMyServiceサービスを公開するよう設定されています。
では、ひな型のうち不要な部分を削除しながら、前回作成したWCFMemberServiceLibraryプロジェクトのSampleServiceサービスをホスティングしていきましょう。
まず、新たに作成したASP.NETプロジェクトに、WCFMemberServiceLibraryプロジェクトへの参照を追加します。[プロジェクト]-[参照の追加]より、WCFMemberServiceLibraryプロジェクトへの参照を追加してください。
次に、WCFサービスの"ABC"を構成ファイル(Web.config)に定義します。[ツール]-[Microsoft Service Configuration Editor]を実行し、[File]-[Open]-[Config File]で既存の「Web.config」を開きます。
あらかじめ定義されたサービスなどはすべて削除し、[Services]-[Create a New Service]を実行してWCFサービスの定義ウィザード"New Service Element Wizard"を開始します。
[Browse]ボタンより、「bin\WCFMemberServiceLibrary.dll」を選択して[Next >]をクリックします。
ドロップダウン一覧より、コントラクトのインターフェイスである[WCFMemberServiceLibrary.ISampleService]を選択して[Next >]をクリックします。
使用する通信方式として、[HTTP]を選択して[Next >]をクリックします。
通信方式としてHTTPを選択した場合、さらにバインディングを選択する必要があります。ここではBasic-Profileを使用しますので、[Basic Web Services Interoperability]を選択して[Next >]をクリックします。
次に、サービスを提供するアドレスを指定します。前述の通り、アドレスは「Service.svc」ファイルのURIで決まりますので、Address欄を空にして[Next >]をクリックします。
アドレスをソースコードで指定するようにメッセージが表示されますので、[はい]をクリックします。
これでサービス定義は完了です。[Finish]をクリックします。
前回の例と同様に、今回もWebサービスを介してコントラクトのメタデータを提供しますので、その設定も行いましょう。メタデータ提供のためのサービス・ビヘイビアの追加方法は前回記事を参照してください。前回と同じように作成したサービス・ビヘイビアをサービスに関連付けすれば構成ファイルの定義は完了です。「web.config」の内容は次のとおりです。
<?xml version="1.0"?> <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <system.serviceModel> <services> <service behaviorConfiguration="NewBehaviour" name="WCFMemberServiceLibrary.SampleService"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" contract="WCFMemberServiceLibrary.ISampleService" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="NewBehaviour"> <serviceMetadata httpGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> <system.web> <compilation debug="true"> <assemblies> <add assembly="System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="Microsoft.Transactions.Bridge, Version=3.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="SMDiagnostics, Version=3.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.IdentityModel.Selectors, Version=3.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="System.Web.RegularExpressions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> </assemblies> </compilation> </system.web> </configuration>
最後に、WCFサービスのエントリポイントである「Service.svc」を編集し、「Web.config」で定義したWCFMemberServiceLibrary.SampleServiceサービスを公開するように変更します。
<% @ServiceHost Language=C# Debug="true"
Service="WCFMemberServiceLibrary.SampleService"%>
Service
属性に今回作成したWCFMemberServiceLibrary.SampleServiceサービスを指定しています。では[F5]キーを押して実行してみましょう。
自動的にVisual Studio 2005のASP.NET開発サーバーが起動し、Internet Explorerで「Service.svc」が開かれます。最初にHTTPベースでホスティングを行った場合と同じ表示内容になっています。
なお、ASP.NET開発サーバーはデフォルトの設定では空きポート番号を自動的に使用します。従って、このままではクライアントからWCFサービスに接続するアドレス(WCFの"Address"はポート番号を含む)がサービスを実行するごとに毎回変わってしまうことになります。[動的ポートの使用]プロパティをFalseにしてポート番号を固定にしても良いのですが、実際の運用を想定し、IISにホスティングさせてみましょう。
[ビルド]-[Webサイトの発行]より、IISにプロジェクトをデプロイします。[ターゲットの場所]に「http://localhost/WCFMyService」を指定して[OK]をクリックしてください。
Webブラウザで「http://localhost/WCFMyService/Service.svc」を開けば、先ほどと同じ画面が表示されるはずです。
後はクライアント側の設定変更ですが、前回扱ったHTTPベースのメタデータ取得&クラス自動生成で行うことができますので、詳細は省略します。
なお、今回の場合は、前回のサンプルから、"ABC"のうち、B(Binding)・C(Contract)は変わっていませんので、再度プロキシクラスを生成することなく、A(Address)のみを変更すれば接続することができます。
「WCFSampleClient/app.config」のendpoint
要素のaddress
属性を次のように変更してください。
<endpoint address="http://localhost:8080/MemberService"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService"
contract="WCFSampleClient.localhost.ISampleService"
name="BasicHttpBinding_ISampleService" />
↓↓↓
<endpoint address="http://localhost/WCFMyService/Service.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService"
contract="WCFSampleClient.localhost.ISampleService"
name="BasicHttpBinding_ISampleService" />
address
属性を、今回IISでホスティングしているWCFサービスのURIに置き換えます。「Program.cs」は先ほどTCPベースに変更したものを、元のHTTPベースのソースコードに戻します。
SampleServiceClient client = new SampleServiceClient(); ↑プロキシクラスを使うように戻す //ChannelFactory<ISampleService> fact = // new ChannelFactory<ISampleService>("EndpointTcp"); ↑TCPベースのコードはコメントアウト //ISampleService client = fact.CreateChannel(); ←同上 ・・・中略・・・ //((IClientChannel)client).Close(); ←同上
以上でIISでホスティングしたWCFサービスへの接続を行うことができます。"ABC"を適切に設定すればソースコード自体の変更は少なくて済む、WCFの本領発揮と言うところです。
まとめ
.NET Framework 3.0入門 第2回、WCFチュートリアルはいかがだったでしょうか。設定の付け替えで通信方式を簡単に切り替えることのできる、WCFのメリットを感じることができたのではないでしょうか。
Visual Studio 2005 Extensions for WCFのサポート範囲はそれほど大きくありませんので、機能的に驚くような部分は無かったかもしれませんが、構成ファイルやプロキシクラスの自動生成など、必要な部分はしっかり押さえていますので、WCF開発に大いに役立ってくれることと思います。
WCFはWPFほどの見た目の派手さはありませんが、さまざまな通信方式を一貫した手法で扱うことができる、強力なフレームワークです。これまでのように、特定の通信方式に依存したコーディングをしたために、他の通信方式への移行が大変になる、ということもありません。また、セキュリティを考慮した通信を行う際にも、やはり構成ファイルでの設定を書き換えるだけで通信内容を暗号化することができるなど、通信に関するさまざまな拡張を行うことができます。複数のサービス間で相互通信が必要となる場合には、ぜひWCFの使用を検討してください。
シリーズ第3回はWFチュートリアルとして、.NET Framework 3.0のワークフロー機能を紹介します。お楽しみに。