COM+ アプリケーションとの統合の概要
Windows Communication Foundation (WCF) では、分散型アプリケーションを作成するための充実した環境が提供されます。 COM+ でホストされるコンポーネント ベースのアプリケーション ロジックを既に使用している場合は、WCF を使用すると、既存のロジックを修正することなく、拡張できます。 既存の COM+ サービスまたはエンタープライズ サービスの業務ロジックを、Web サービスを介して公開する場合に役立ちます。
COM+ コンポーネントのインターフェイスを Web サービスとして公開する場合、その仕様やコントラクトは、アプリケーションの初期化の際に実行される自動マッピングによって決まります。 このマッピングの概念モデルを次に示します。
公開する COM クラスごとに 1 つのサービスが定義されます。
サービスのコントラクトは、選択されたコンポーネントのインターフェイス定義から直接派生しますが、一部のメソッドを除外することも可能です。
このコントラクトに定義する操作は、コンポーネントのインターフェイス定義のメソッドから直接派生します。
操作のためのパラメーターは、コンポーネントのメソッド パラメーターに対応する COM の (相互運用性を実現するための) 型から直接派生します。
サービスのアドレス既定値やトランスポート バインディングは、サービス構成ファイルに記述しますが、必要に応じて再設定も可能です。
Note
公開した Web サービスのコントラクトは、COM+ インターフェイスや構成を変更しない限り変わりません。 また、複数のインターフェイスを変更しても、利用できるサービスが自動的に更新されることはありません。COM+ サービス モデル構成ツール (ComSvcConfig.exe) を再実行する必要があります。
COM+ アプリケーションおよびそのコンポーネントの認証/承認要求は、Web サービスを使う場合でもやはり必要です。
呼び出し元が Web サービス トランザクションを起動すると、トランザクション処理中としてマークされたコンポーネントが、該当するトランザクション スコープに入ります。
COM+ コンポーネントを修正することなく、そのインターフェイスを Web サービスとして公開するための手順を次に示します。
COM+ コンポーネントのインターフェイスを、実際に Web サービスとして公開してかまわないかどうか、あらかじめ確認してください。
適切なホスティング モードを選択します。
COM+ サービス モデル構成ツール (ComSvcConfig.exe) を使用して、当該インターフェイスを公開するための Web サービスを追加します。 ComSvcConfig.exe の使用方法の詳細については、「方法: COM+ サービス モデル構成ツールを使用する」を参照してください。
アプリケーション構成ファイルで、追加のサービス設定を構成します。 コンポーネントの構成方法の詳細については、「方法: COM + サービス設定を構成する」を参照してください。
公開可能なインターフェイス
Web サービスとして公開できるインターフェイスの種類に関して、いくつか制約があります。 次のようなインターフェイスは公開できません。
オブジェクト参照をパラメーターとして渡すインターフェイス。ただし、「オブジェクト参照を渡せる場合」で説明されているようにいくつか例外があります。
.NET Framework COM 相互運用変換ができない型を渡すインターフェイス。
COM+ でサービスを提供する場合にアプリケーション プールが有効になるアプリケーションに対するインターフェイス。
アプリケーション内部でのみ有効な (プライベートと指定された) コンポーネントのインターフェイス。
COM+ インフラストラクチャ インターフェイス。
システム アプリケーションからのインターフェース。
エンタープライズ サービス コンポーネントからのインターフェイスで、グローバル アセンブリ キャッシュに追加されていないもの。
オブジェクト参照を渡せる場合
展開済みの COM+ コンポーネントの多くが、ADO Recordset オブジェクトを返す場合などに、パラメーターとしてオブジェクト参照を渡すようになっているため、COM+ 統合においても、一定の条件を満たす場合には、オブジェクト参照をパラメーターとして渡せるようになっています。 オブジェクト参照を渡せるのは、IPersistStream
COM インターフェイスを実装しているオブジェクトに限ります。 たとえば ADO Recordset オブジェクトがそうで、アプリケーション固有の COM オブジェクトについてはオブジェクト参照を実装できます。
これに対応して、ComSvcConfig.exe ツールには、メソッドの引数型並び (署名) の検査を省略する allowreferences スイッチが用意されています。このスイッチを使用すると、オブジェクト参照がパラメーターに現れていてもエラーになりません。 ただし、パラメーターとして渡すオブジェクト型に名前を付け、<persistableTypes>
構成要素 (<comContract>
要素の子要素) 内で識別できるようにする必要があります。
この機能を使用する場合、COM+ 統合サービスは、IPersistStream
インターフェイスを使用してオブジェクト インスタンスのシリアル化および逆シリアル化を行います。 オブジェクト インスタンスが IPersistStream
インターフェイスを実装していない場合、例外がスローされます。
クライアント アプリケーションがサービスとの間でオブジェクトをやり取りするためには、PersistStreamTypeWrapper オブジェクトの該当するメソッドを使用できます。
Note
このメソッドは、プラットフォーム固有の独自の方式でシリアル化を行うため、WCF クライアントと WCF サービスの間での使用に最も適しています。
ホスティング モードの選択
COM+ が Web サービスを公開する際のホスティング モードには、次のようなものがあります。
COM+ ホスト
Web サービスを各アプリケーション専用の COM+ サーバー プロセス (Dllhost.exe) から提供します。 この場合、実際に Web サービス要求が届く前に、あらかじめアプリケーションを起動しておかなければなりません。 COM+ オプション "Run as an NT Service" または "Leave running when idle" を指定することにより、アプリケーションやサービスがアイドル状態になっても停止しないようになります。 このモードでは、サーバー アプリケーションから Web サービスと DCOM アクセスの両方を利用できます。
Web ホスト
Web サービスを Web サーバーのワーカー プロセス内で提供します。 最初の要求が届いた時点で、あらかじめ COM+ がアクティブになっている必要はありません。 必要に応じ、自動的にアクティブ化してから要求を処理するようになっています。 このモードでも、サーバー アプリケーションから Web サービスと DCOM アクセスの両方を利用できますが、Web サービス要求の転送が発生するため、プロセス ホップが発生します。 通常、クライアント側で偽装が必要になります。 WCF では、WindowsClientCredential クラスの AllowedImpersonationLevel プロパティ (ジェネリック ChannelFactory<TChannel> クラスのプロパティとしてアクセス) および Impersonation 列挙値を使用して、これを行います。
Web ホスト (インプロセス)
Web サービスと COM+ アプリケーション ロジックの両方を Web サーバーのワーカー プロセス内で提供します。 Web サービス要求を転送することなく、自動的に Web ホスト モードにすることができます。 ただし、サーバー アプリケーションに DCOM でアクセスできない、という短所があります。
セキュリティに関する考慮事項
他の WCF サービスと同様に、公開するサービスのセキュリティ設定は、WCF チャネルの構成設定を介して管理されます。 従来の DCOM セキュリティ設定には、コンピューター全体のアクセス権限設定などがありましたが、これは必須ではありません。 COM+ アプリケーション ロールを強制する場合、コンポーネントの "コンポーネント レベルのアクセス確認" 承認を有効にする必要があります。
セキュリティ保護されていないバインディングは改ざんや情報漏洩を招くので、 セキュリティ保護されたバインディングを使用することをお勧めします。
"COM+ ホスト" モードおよび "Web ホスト" モードの場合、クライアント アプリケーション側で、サーバー プロセスによるクライアント ユーザーの偽装を許可する必要があります。 これを行うには、WCF クライアント側で偽装レベルを Impersonation に設定します。
インターネット インフォメーション サービス (IIS) または Windows プロセス アクティブ化サービス (WAS) で HTTP トランスポートを使用する場合、Httpcfg.exe ツールでトランスポート エンドポイントのアドレスを確保し、他の用途には使用しないように予約することができます。 他の構成では、正当なサービスのように機能する不正なサービスからの防御が重要です。 接続先のエンドポイントで不正なサービスが起動されるのを防ぐため、正当なサービスは NT サービスとして動作するよう設定するとよいでしょう。 これにより、正当なサービスは、他の不正なサービスに優先してエンドポイント アドレスを確保できるようになります。
COM+ ロールを設定した COM+ アプリケーションを "Web ホスト" モードで公開する場合は、アプリケーションのロールとして "Launch IIS Process Account" を追加する必要があります。 このアカウントは通常、IWAM_machinename という形の名前で、オブジェクトの使用後、安全にシャットダウンできるようにするために必要です。 ただし、このアカウントにその他の権限は与えないでください。
COM+ のプロセス リサイクル機能は、統合アプリケーションでは使えません。 アプリケーションがこの機能を使用するよう設定されている場合、コンポーネントが COM+ ホスト プロセスとして動作していると、サービスを起動できません。 "Web ホスト (インプロセス)" モードであれば、プロセス リサイクル設定は適用されないので問題ありません。