SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Vista時代のプログラミングモデル .NET Framework 3.0入門

WCF(Windows Communication Foundation)チュートリアル 後編

Vista時代のプログラミングモデル .NET Framework 3.0入門 (4)


  • X ポスト
  • このエントリーをはてなブックマークに追加

IISによるWCFサービスのホスティング

 ここまでのサンプルでは、WCFサービスをWindowsフォームアプリケーションでホスティングし、サービスの開始・終了を行ってきました。

 ただ、WCFサービスをWebサービスとして公開する場合には、独自のホスティングアプリケーションを使用するよりも、IISでホスティングする方が管理しやすい場合があるかもしれません。

 ここからは、IISによるWCFサービスのホスティング方法について説明します。

IISでのホスティング方法

 まず、Visual Studio 2005でASP.NETベースでのホスティングを行うプロジェクトを作成しましょう。[ファイル]-[新規作成]-[Webサイト]から、"WCF Service"というWCFサービスホスティング用のプロジェクトを追加します。

WCF Serviceプロジェクト作成
WCF Serviceプロジェクト作成

 プロジェクトを作成すると、WCFサービスのホスティングのひな型があらかじめ準備されています。

 まず、「Service.svc」というファイルですが、拡張子svcというファイルはASP.NETでWCFサービスをホスティングする際のエントリポイントです。このファイルのURLがWCFサービスを提供する際の"ABC"のA(Address)となります。

IISでのホスティングの際のAddress
 ということですので、IISでホスティングを行う際にAddressをあらかじめ指定する必要はありません。拡張子svcのファイルが存在する位置がAddressになります。

 このファイルの内容は次のとおりです。

プロジェクト作成直後のService.svcファイル
<% @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プロジェクトへの参照を追加してください。

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 >]をクリックします。

Address欄を空にした場合のメッセージダイアログ
Address欄を空にした場合のメッセージダイアログ

 アドレスをソースコードで指定するようにメッセージが表示されますので、[はい]をクリックします。

サービス定義完了
サービス定義完了

 これでサービス定義は完了です。[Finish]をクリックします。

 前回の例と同様に、今回もWebサービスを介してコントラクトのメタデータを提供しますので、その設定も行いましょう。メタデータ提供のためのサービス・ビヘイビアの追加方法は前回記事を参照してください。前回と同じように作成したサービス・ビヘイビアをサービスに関連付けすれば構成ファイルの定義は完了です。「web.config」の内容は次のとおりです。

作成したweb.configの内容(IISホスティング版)
<?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サービスを公開するように変更します。

変更したService.svcの内容
<% @ServiceHost Language=C# Debug="true"
   Service="WCFMemberServiceLibrary.SampleService"%>

 Service属性に今回作成したWCFMemberServiceLibrary.SampleServiceサービスを指定しています。では[F5]キーを押して実行してみましょう。

 自動的にVisual Studio 2005のASP.NET開発サーバーが起動し、Internet Explorerで「Service.svc」が開かれます。最初にHTTPベースでホスティングを行った場合と同じ表示内容になっています。

Service.svc表示。ここではポート番号2851が使用されている
Service.svc表示。ここではポート番号2851が使用されている

 なお、ASP.NET開発サーバーはデフォルトの設定では空きポート番号を自動的に使用します。従って、このままではクライアントからWCFサービスに接続するアドレス(WCFの"Address"はポート番号を含む)がサービスを実行するごとに毎回変わってしまうことになります。[動的ポートの使用]プロパティをFalseにしてポート番号を固定にしても良いのですが、実際の運用を想定し、IISにホスティングさせてみましょう。

 [ビルド]-[Webサイトの発行]より、IISにプロジェクトをデプロイします。[ターゲットの場所]に「http://localhost/WCFMyService」を指定して[OK]をクリックしてください。

http://localhost/WCFMyServiceへプロジェクトをデプロイ
http://localhost/WCFMyServiceへプロジェクトをデプロイ

 Webブラウザで「http://localhost/WCFMyService/Service.svc」を開けば、先ほどと同じ画面が表示されるはずです。

 後はクライアント側の設定変更ですが、前回扱ったHTTPベースのメタデータ取得&クラス自動生成で行うことができますので、詳細は省略します。

 なお、今回の場合は、前回のサンプルから、"ABC"のうち、B(Binding)・C(Contract)は変わっていませんので、再度プロキシクラスを生成することなく、A(Address)のみを変更すれば接続することができます。

 「WCFSampleClient/app.config」のendpoint要素のaddress属性を次のように変更してください。

WCFSampleClient/app.config endpoint要素(前回)
<endpoint address="http://localhost:8080/MemberService"
          binding="basicHttpBinding"
          bindingConfiguration="BasicHttpBinding_ISampleService"
          contract="WCFSampleClient.localhost.ISampleService"
          name="BasicHttpBinding_ISampleService" />

 ↓↓↓

WCFSampleClient/app.config endpoint要素(今回)
<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ベースのソースコードに戻します。

Program.cs 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のワークフロー機能を紹介します。お楽しみに。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Vista時代のプログラミングモデル .NET Framework 3.0入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 土井 毅(ドイ ツヨシ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1243 2007/09/20 16:08

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング