Bill Gibson、プログラム マネージャ
Microsoft Corporation
日本語版最終更新日 2007 年 11 月 27 日
適用対象 :
Microsoft Visual Studio 2005 Team System
置換可能な Web サービスを作成する理由
インターフェイス指向のプログラミング モデルの主なメリットは、あるインターフェイスの実装を別の実装に置き換えられることです。この機能により、次の作業を実現できます。
- サービスのスタブ バージョンによるクライアント アプリケーションのテスト。
- パフォーマンスや永続性などの特性の異なる代替実装の作成。
- 異なるソースから生成された実装の置き換え。
- 共通の監査や追跡インターフェイスなど、共通動作の実装。
コントラクトにより定義される Web サービスは、実装型ではなく、メッセージ スキーマを利用して疎結合の遅延バインディングが可能な特殊なインターフェイス指向プログラミングモデルです。このバインディング モデルでは、クライアントを再コンパイルする必要さえなく、あるサービスを別のサービスに容易に置き換えることができます。置き換えを行う場合、構成ファイル内のサービスの URL エントリを切り替えるだけで、サービスを置き換えることができます。
分散システム デザイナには、置換可能な Web サービスのデザインとテストを支援する機能がいくつかあります。ここではこれらの機能について説明します。
Web サービスのインターフェイス定義は、多くの場合コントラクトと呼ばれ、WSDL (Web サービス記述言語) を使用して表現および外部から参照されます。WSDL ドキュメントでは、サービスがサポートする操作やメッセージを記述します。
ASMX Web サービスを定義する 3 種類の方法
ASP.NET (ASMX) Web サービスを作成する一般的な方法には、次の 3 種類があります。
- 既存の WSDL コントラクトを基に、これから ASMX 実装を作成する。
- アプリケーション デザイナを使用し、その WSDL ベースの抽象化と .NET ベースの抽象化を組み合わせて動作を定義する。
- ASMX プログラミングモデルで直接プログラミングし、サービス実装のすべての要素を管理し、クラスとメソッドに属性を追加して独自にコントラクトを作成する。
事前に定義されている WSDL ドキュメントからサービスの骨組みとなる実装を作成する場合、必要な作業はごくわずかです。
WSDL.exe ユーティリティを ‘/server’スイッチを指定して使用し、結果を調整して、.asmx ファイルを追加します。または、WSDL.exe と同様の機能を持つアプリケーションデザイナのビルトイン機能を使用することもできます (この場合プロジェクト内に実装が作成され、.asmx ファイルが自動的に作成されます)。
または、アプリケーション デザイナを使用し、CLR 型を使用してメッセージ定義を指定することで、操作ごとにサービスをデザインすることもできます。サービスを実装すると、デザインビューとコードが自動的に同期されるため、どちらの方法を使用して変更を行っても、変更は直ちに他方に反映されます。デザイン ツールでは属性モデルの詳細が表示されず、ユーザーが動作の定義に専念できるようにしています。
すべてコードでサービスを定義する場合は、ユーザー自身が属性を使用してサービスとエンドポイントの抽象化を管理する必要があります。これは困難な作業ではありませんが、退屈でエラーを生じやすい方法です。コードを使用し、特に複数の置換可能なサービスを作成する場合は、再利用を容易にするため、ASMX 属性を用いたインターフェイスを使用してコントラクトを定義することをお勧めします。
これら 3 種類のどの方法を使用しても置換可能なサービスを定義できますが、ここでは、アプリケーション デザイナによってサポートされる方法のみを説明します。
WSDL を使用した置換可能なサービスの作成
同じ WSDL ファイルを基盤とする複数の Web サービスを作成する場合、これらは置換可能なサービスになります。
WSDL を使用する場合、わずかに違いがある 2 とおりの方法があります。
1 つ目の方法では、WSDL ファイルを基に、これから複数のサービス実装の "スタンプ" を作成します。
2 つ目の方法では、Web サービスの "参照" を基に、公開された WSDL コントラクトを実装する別のサービスを作成します。
1 つ目の方法では、ASP.NETWebService ツールボックスプロトタイプを使用して、アプリケーション ダイアグラムに新しい ASP.NetWebApplication を追加し、既定のエンドポイントを削除します。これにより、確実に EmptyWebSite プロジェクト テンプレートが使用されるようにします。アプリケーションを右クリックし、[WSDL からの Web サービス エンドポイントの作成] を選択して、WSDL ファイルの場所を指定します。このファイルは単一の SOAP 1.1 エンドポイントを備えた有効な WSDL ドキュメントである必要があります。また、ポートアドレスが指定された有効な WSDL サービス エントリとポート エントリを含む必要もあります。この処理によってサービスは起動されないため、これらのエントリがない WSDL ドキュメントがあり、これらのエントリを手動で追加する必要がある場合は、任意のアドレスを指定できます。
2 つ目の方法では、WSDL を使用して既存の Web サービスの動作を複製します。この場合、Web サービスが WSDL 要求をサポートしていて、自身の WSDL コントラクトを返すことができる必要があります。
ASMX などの Web サービスは、これをサポートしています。前述の手法を使用してエンドポイントを追加し、サービスのエンドポイントのアドレスを WSDL の場所として使用するだけです。
コピーと貼り付けを使用した置換可能な Web サービスの作成
別の方法として、ASP.NET アプリケーションとそのエンドポイントをコピーして貼り付けることにより置換可能なアプリケーションを作成するか、必要な Web サービス エンドポイントのみを既存の ASP.NET アプリケーションにコピーして、コピーしたエンドポイントにより置換可能にすることができます。ただし、外部 Web サービスや外部 Web サービスのエンドポイントはコピーすることができないため、この場合は WSDL を用いる方法を使用してください。
コピーと貼り付けでは、常に、エンドポイントの情報のみがコピーされ、コードはコピーされません。操作と署名のほか、WSDL
やその他のプロパティがコピーされます。これにより、コピーしたエンドポイントを置換可能なエンドポイントにしています。エンドポイントをコピーして貼り付ける方法と、WSDL から Web サービス エンドポイントを作成する方法では、結果にいくつかの顕著な違いがあります。これについては、コピーと貼り付けの方法と WSDL から Web サービス エンドポイントを作成する方法の違いに関する別の資料で説明します。
サービスの置き換え
置換可能なサービスを作成または特定したら、アプリケーション デザイナとシステム デザイナを使用して実際にサービスを置き換えることができます。アプリケーションデザイナはソリューションのビューを提供します。したがって、このダイアグラムに変更を加えると、この変更は直ちにソリューションに含まれるプロジェクトの構成に反映されます。システムデザイナでは、システムの定義に基づいてシステムを配置した時点で変更が反映されます。
アプリケーション デザイナでの置き換え
アプリケーション ダイアグラムでサービスを置き換えるには、2 つのWeb サービス エンドポイント間の接続を削除したうえで、コンシューマ エンドポイントを代替サービスの適切なプロバイダ エンドポイントに接続し直します。ただし、
2 つのエンドポイント間で WSDL バインド名およびバインド名前空間のプロパティが異なる場合は警告が表示されます。サービスが置換可能であることが確かな場合、この警告は無視できます。この簡単な型チェックが行われるのは、従来、サービスの型の識別にバインド名と名前空間が使用されているためです (上記の方法ではどの方法でも WSDL バインド名と名前空間の値が同じサービスが作成されるため、警告は表示されません
)。
実装済みアプリケーションのコンシューマ エンドポイントを新しいプロバイダ エンドポイントに接続し直すと、接続を永続的な接続にするか一時的な接続にするかの問い合わせを受けます。永続的な接続にすると、Web サービス プロキシが新たに接続されたサービスにより再生成されます。この場合、サービスに対する追加の変更が、自動的にプロキシに反映されるようになります。一時的な接続にすると、構成ファイルのみが新しいサービスの URL で更新されます。これは、クライアントを変更せずにサービスが有効な置換可能なサービスであることを確認する場合に適しています。
サービス デザイナでの置き換え
メンバ間の "接続" またはシステムとメンバエンドポイント間の "デリゲート" を変更することで、サービスを置き換えることができます。前述した型チェックと同じチェックが実行されますが、この場合も警告は無視できます。
接続を変更してサービスを置き換える場合は、既存の接続を削除して、新しい接続を作成するだけです。任意のエンドポイントにマウスを移動し、Alt キーを押しながら接続をドラッグすることで、接続を作成できます。
デリゲートを変更することでサービスを置き換える場合は、デリゲートを削除しないでください。削除するとシステム エンドポイントが削除され、他のシステムに影響を及ぼす可能性があります。この場合はシステムエンドポイントを代替のエンドポイントに接続するだけで、デリゲートが "移動" されます。これは、トップダウン方式でシステムをデザインする場合に有効です。デリゲートの移動の詳細については、「トップダウン方式のシステム デザイン」を参照してください。
まとめ
分散システム デザイナは、同じコントラクトを使用する代替実装の作成および置き換えを実現する複数の方法をサポートしています。