以前から WCF のサービスとクライアントで DataContract を付与したクラスを共有する方法を調べてみようと思っていたのでその方法をまとめてみました。今回は Visual Studio 2010 のサービス参照の追加からプロキシを生成するパターンと、svcutil コマンドを使用して プロキシクラスを生成するパターンで方法を調べてみました。

今回は、WCF サービスで使用している DataContract を付与したクラスをクライアントでも使用する方法を記載していますが、 プロキシクラスを生成せずに WCFサービス側で使用している サービスコントラクト インタフェース をクライアント側で使用して 通信を行うこともできます。 下記URLなどを参照してください。

WCF Sample 022 : ChannelFactoryを使用してプロキシクラスを事前生成せずにクライアントからサービスに接続する
http://www.pine4.net/Memo/Article/Archives/47

今回の検証した環境は次の通りです

  • Visual Studio 2010 Professional
  • .NET 4.0 (WCF 4)
  • IIS 7.5 (Visual Studio から サービス参照の追加でプロキシクラスを生成するときに WCFサービスのホストとして使用)

1. Visual Studio 2010 のサービス参照の追加でプロキシを生成する場合

前提条件を記載します

  • WCF サービスは IIS 等でホストされている
  • WCFサービスはメタデータを公開している
  • WCFクライアントプロジェクトから DataContract を付与したクラスのdll を参照できる

Visual Studio のソリューションエクスプローラー から WCF クライアント用のプロジェクトを右クリック→参照の追加で DataContract が付与されたクラスが含まれるプロジェクトか dll 自身をプロジェクトの参照先に追加します。実はこれだけで設定は完了ですが、詳細を見ていきます。

WCF クライアント用のプロジェクトを右クリック→サービス参照の追加 をクリックします。サービス参照の追加画面が表示されます。通常は アドレスにサービスのエンドポイントアドレスを指定します。今回は、画面左下の詳細設定ボタンをクリックします。

サービス参照設定画面が表示されます。下図赤枠らんのように 参照されたアセンブリで型を再利用がチェックされていることを確認してください。本設定により、プロジェクトで参照されているデータ型がプロキシクラスの生成の代わりに使用されるようになります。特定のアセンブリに含まれる型のみ再利用したい場合は、 参照されたアセンブリを指定して型を再利用 を選択して、WCFサービスと共有したいクラスの含まれるアセンブリを選択します。

OKボタンをクリックしてウィザードを進めていくことにより DataContract クラスのプロキシ以外のサービスコントラクトなどのクライアント用のプロキシクラスが生成されます。

WCFサービスがすでにホストされている場合 上記のVisual Studio のサービス参照の追加ウィザードによるプロキシクラスの生成が簡単な手順となります。

次に コマンドプロンプトを使用して DataContract クラスを共有する プロキシクラスの生成方法を記載します。

2. コマンドプロンプト svcutil.exe を使用して プロキシクラスを生成する場合

svcutil を使用してWCF サービスと同じ DataContract クラスを利用する WCFクライアント用プロキシを作成する前提を記載します。

  • DataContract を付与したクラスのdll を参照できる
  • サービスコントラクトが含まれる dll を参照できる

今回は dll から wsdl, xsd ファイルを生成し、 wsdl,xsd から WCFクライアント用プロキシを生成します。wsdl, xsd ファイルがある場合は サービスコントラクト用のdllは不要です。サービスコントラクトとDataContract のdll は別々のdll の方が手順が簡単になります。

移行のサンプルでは DataContract 用のdll を SimpleDataContract.dll 、サービスコントラクト用のdll を SimpleService.dll として説明を記載します。

2.1 wsdl と xsd ファイルの生成

Visual Studio 2010 用のコマンドプロンプトを起動します。次のコマンドを使用して wsdl, xsd ファイルを生成します。処理が成功すると wsdl と xsd ファイルが生成されます。

svcutil SimpleService.dll SimpleDataContract.dll

2.2 プロキシクラスの生成

引き続き クライアントで使用するための サービスプロキシクラスを生成します。次のコマンドを入力します。svcutil に /reference パラメータを指定して クライアント側で再利用するDataContract クラスの含まれる dll を指定しています。最低限のパラメータを指定していますが、必要に応じてほかのパラメータも指定してください。

svcutil /namespace:*,Client1 tempuri.org.wsdl *.xsd /reference:SimpleDataContract.dll

生成された cs ファイルを確認すると DataContract クラス用のプロキシクラスは生成されず、生成されたサービスプロキシクラスは SimpleDataContract.dll に含まれる DataContract クラスを使用する前提でインタフェースが定義されているはずです。

もしサービスコントラクトとDataContract クラスが同じプロジェクト(同じアセンブリ) に定義されている場合上記コマンドを実行すると cs ファイルが作成されません。ServiceContract 用のクラスも再利用すると判断されるためです。ServiceContract 用のクライアント側のプロキシを生成する場合は /excludeType パラメータでサービスコントラクトのインタフェースを指定してください。

例えば、 WCFShareDataContract.dll に DataContract クラスと ServiceContract クラス(Interface) が定義されている場合、次のように wsdl を生成し、 /excludeType でサービスコントラクトのインタフェース型を指定します。複数ある場合は /excludeType を複数指定します。

svcutil WCFShareDataContract.dll
svcutil  tempuri.org.wsdl *.xsd  /reference:WCFShareDataContract.dll /excludeType:WCFShareDataContract.IProductService

3. まとめ

説明は以上です。DataContract クラスをWCFサービスと WCFクライアントで共有するサービスプロキシクラスの生成方法を記載しました。

指摘事項や間違いなどあればご連絡ください。