COM+ 統合 : COM+ ホスト

Download sample

このサンプルは、COM+ アプリケーションのインターフェイスを Windows Communication Foundation (WCF) サービスとして公開する手順と、公開されたサービスを WCF クライアントから呼び出す手順を示します。このサンプルは、クライアント コンソール プログラム (.exe) と COM+ 内に登録された Enterprise Services ライブラリ アプリケーション (.dll) で構成されています。このサンプルは、電卓サービスを実装し、「COM+ 統合 : Web によるホスト」のサンプルに似た「入門サンプル」のサンプルに基づいています。このサンプルでは COM+ ホストと TCP トランスポートを使用して、「COM+ 統合 : Web によるホスト」のサンプルよりも優れたパフォーマンスを実現する方法を示しますが、要求を処理する前に明示的にアクティブ化された COM+ アプリケーションが必要になります。

Noteメモ :

このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。

Enterprise Services アプリケーションには、算術メソッド (Add、Subtract、Multiply、および Divide) を公開する単一 ICalculator インターフェイスを実装するコンポーネントが 1 つ含まれています。

// Define the component's interface.
public interface ICalculator
{
    double Add(double n1, double n2);
    double Subtract(double n1, double n2);
    double Multiply(double n1, double n2);
    double Divide(double n1, double n2);
}

このインターフェイスは、要求/応答通信パターンを定義するサービス コントラクトとして公開されています。クライアントは算術演算を同期要求し、サービスとその構成コンポーネントは結果を添えて応答します。クライアント アクティビティは、コンソール ウィンドウに表示されます。

サービスは COM+ を使用してプロセス内でホストされるので、アプリケーション ServiceModelHostedSample を手動で開始してサービス エンドポイントをアクティブ化する必要があります。ESCalculatorService クラス実装は、計算結果を返します。

// Supporting implementation for the ICalculator interface.
public class ESCalculatorService : ServicedComponent, ICalculator
{
    public double Add(double n1, double n2)
    {
        return n1 + n2;
    }
    public double Subtract(double n1, double n2)
    {
        return n1 - n2;
    }
    public double Multiply(double n1, double n2)
    {
        return n1 * n2;
    }
    public double Divide(double n1, double n2)
    {
        return n1 / n2;
    }
}
Noteメモ :

このクラスは ServiceModel 固有のコードを含まない一般的なエンタープライズ サービス アセンブリです。このエンタープライズ サービス アセンブリは、エンタープライズ サービスの属性が設定され、署名されて、グローバル アセンブリ キャッシュ (GAC) に追加されます。

選択したインターフェイスのサポート サービスを追加するには、COM+ Service Model Configuration Tool (ComSvcConfig.exe) を使用します。この実行に使用するコードは次のとおりです。

ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose

この場合、ツールにより ServiceModelHostedSample.ESCalculator コンポーネントの ICalculator インターフェイスが追加されます。このコンポーネントは ServiceModelHostedSample アプリケーション内にあります。サービスは Metadata Exchange エンドポイントを使用して COM+ 内でホストされます。ServiceModelInitializer コンポーネントが、統合を容易にするためにこのアプリケーションに追加されると、アプリケーション構成ファイルが COM+ アプリケーションのアプリケーション ルート ディレクトリ (この場合は "%PROGRAMFILES%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\") 内に生成されます。ServiceModelInitializer コンポーネントでは、アプリケーションの起動時にアプリケーション構成ファイルをチェックして、適切に構成されたサービス エンドポイントを開始します。

COM+ でホストされるサービスの場合、COM+ Service Model Configuration Tool (ComSvcConfig.exe) ツールは、同一コンピュータへのアクセスのみに対応した netNamedPipeBinding を使用してサービス エンドポイントを作成します。他のトランスポート上のエンドポイントも提供されるよう、構成ファイルをさらに編集する必要があります。このサンプルでは、次のように netTcpBinding と wsHttpBinding バインディングを使用して、TCP と HTTP にアプリケーションを公開するカスタム構成ファイルを使用します。

<!-- Specify the service (application and component GUIDs) and service and MEX endpoints -->
<services>
  <service behaviorConfiguration="ComServiceMexBehavior"
           name="{4CDCDB2C-0B19-4534-95CD-FBBFF4D67DD9},{C2B84940-AD54-4A44-B5F7-928130980AB9}">
    <endpoint
           address="ICalculator"
           binding="netTcpBinding"
           bindingConfiguration="comNonTransactionalBinding"
           contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}" />
    <endpoint
           address="ICalculator"
           binding="wsHttpBinding"
           bindingConfiguration="comNonTransactionalBinding"
           contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}" />
    <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange" />
    <host>
      <!-- Specify base addresses for both transports -->
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8081/ServiceModelHostedSample" />
        <add baseAddress="https://localhost:8082/ServiceModelHostedSample" />
      </baseAddresses>
    </host>
  </service>
</services>

このサンプルの構成ファイルでは、サービスの名前と名前空間もカスタマイズされます。このため、この構成ファイルを使用すれば、コンポーネントによって提供される操作のサブセットのみを公開できます。この場合、次のように Divide メソッドがコメント化され、公開されるサービス コントラクトから除外されています。

<!-- comContract specifying the name, namespace and methods for the service -->
<comContracts>
  <comContract
      contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}"
      name="ICalculator"
      namespace="https://microsoft.com/Microsoft.ServiceModel.Samples/EnterpriseServicesHosted"
      requiresSession="true">
    <exposedMethods>
      <add exposedMethod="Add" />
      <add exposedMethod="Subtract" />
      <add exposedMethod="Multiply" />
      <!-- <add exposedMethod="Divide" /> -->
    </exposedMethods>
  </comContract>
</comContracts>

クライアントは、コントラクトとの通信に、Service Metadata Utility Tool (Svcutil.exe) によって生成されたクライアントを使用します。クライアントは、App.config の構成と互換性のある generatedClient.cs ファイルに含まれています。このユーティリティは、サービスが使用するメタデータを取得し、コントラクト型との通信に使用するクライアントを生成します。クライアント コードを生成するには、ホストされるサービスを利用できる必要があります。このサービスは、サービス メタデータの取得に使用されるためです。次のコマンドをクライアント ディレクトリでコマンド プロンプトから実行して、型指定のあるプロキシを生成します。

svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost:8082/ServiceModelHostedSample/mex /out:generatedClient.cs /config:App.config

クライアント実装は、TCP バインディング構成を使用して生成されたクライアントのインスタンスを構築します。これをサービスとの通信を開始するのに使用できます。

// Create a client.
CalculatorClient client = new CalculatorClient("NetTcpBinding_ICalculator ");
WSHttpBinding_ICalculator
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

// Call the Subtract service operation.
value1 = 145.00D;
value2 = 76.54D;
result = client.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

// Call the Multiply service operation.
value1 = 9.00D;
value2 = 81.25D;
result = client.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

//Closing the client gracefully closes the connection and cleans up resources.
client.Close();

このサンプルを実行する場合は、操作要求および応答はクライアントのコンソール ウィンドウに表示されます。ここでは、生成された WCF サービスを WCF クライアントから使用する方法を示します。クライアントをシャットダウンするには、クライアント ウィンドウで Enter キーを押します。

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25

Press <ENTER> to terminate client.

サンプルをセットアップしてビルドするには

  1. Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。

  2. ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。このビルド プロセスでは、COM+ アプリケーションを作成してこれを "Leave running when idle" としてマークするスクリプトが実行されます。これにより、サービス エンドポイントが非アクティブになっても自動的にシャットダウンされなくなります。

  3. コマンド プロンプトで、サンプルの service\bin フォルダに移動します。Windows Vista または Windows Server 2008 を使用する場合は、コマンド プロンプトを管理者として実行してください。

  4. gacutil.exe /i ESCalculatorHosted.dll」と入力して、アセンブリをグローバル アセンブリ キャッシュ (GAC) に追加します。現在のパス設定で Gacutil.exe にアクセスできることを確認します。

  5. regsvcs.exe ESCalculatorHosted.dll」と入力して、アセンブリのコンポーネントと ServiceModelSample アプリケーションを COM+ に登録します。現在のパス設定で Regsvcs.exe にアクセスできることを確認します。

  6. ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose」と入力して、インターフェイスをインターネット インフォメーション サービス (IIS) でホストされるサービスとして公開します。現在のパス設定で ComSvcConfig.exe にアクセスできることを確認します。

  7. 既定の構成をこのサンプルのカスタム構成に置き換えるには、ファイル Service/application.config をディレクトリ %ProgramFiles%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\ にコピーします。

サンプルを同じコンピュータで実行するには

  1. アプリケーションとエンドポイントを起動するには、コンポーネント サービス管理コンソールを使用して、ServiceModelHostedSample を右クリックし、[開始] をクリックします。

  2. ブラウザにアドレス https://localhost:8082/ServiceModelHostedSample を入力して、サービスにアクセスできるかどうかをテストします。これに応答して、確認ページが表示されます。

  3. 言語固有のフォルダの下の \client\bin\ にある Client.exe を実行します。クライアント アクティビティがクライアント コンソール ウィンドウに表示されます。

  4. クライアントとサービス間で通信できない場合は、「トラブルシューティングのヒント」を参照してください。

    Noteメモ :

    このサンプルでは、コンソール アプリケーション クライアント プログラムをビルドします。出力を表示するには、コマンド プロンプトで起動する必要があります。

サンプルを別のコンピュータで実行するには

  1. ファイル ESCalculatorHosted.dll を service\bin ディレクトリからサービス コンピュータのディレクトリにコピーします。ファイル CreateAppLeaveRunning.vbs も同様に、サービス ディレクトリからサービス コンピュータのディレクトリにコピーします。

  2. コマンド プロンプトで、サービス コンピュータのコピー先ディレクトリに移動します。Windows Vista または Windows Server 2008 を使用する場合は、コマンド プロンプトを管理者として実行してください。

  3. スクリプト CreateAppLeaveRunning.vbs を実行して、"Leave running when idle" 設定の COM+ アプリケーションを作成します。

  4. gacutil.exe /i ESCalculatorHosted.dll」と入力して、アセンブリをグローバル アセンブリ キャッシュ (GAC) に追加します。現在のパス設定で Gacutil.exe にアクセスできることを確認します。

  5. regsvcs.exe ESCalculatorHosted.dll」と入力して、アセンブリのコンポーネントと ServiceModelSample アプリケーションを COM+ に登録します。現在のパス設定で Regsvcs.exe にアクセスできることを確認します。

  6. ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose」と入力して、インターフェイスを IIS でホストされるサービスとして公開します。現在のパス設定で ComSvcConfig.exe にアクセスできることを確認します。

  7. 既定の構成をこのサンプルのカスタム構成に置き換えるには、ファイル Service/application.config をディレクトリ %ProgramFiles%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\ にコピーします。

  8. サービス アプリケーションの構成ファイルで、エンドポイント定義のアドレス値をサービスの新しいアドレスに変更します。アドレスの "localhost" への参照をすべて完全修飾ドメイン名に置き換えます。

  9. アプリケーションとエンドポイントを起動するには、コンポーネント サービス管理コンソールを使用して、ServiceModelHostedSample を右クリックし、[開始] をクリックします。

  10. クライアント プログラム ファイルを、言語固有のフォルダにある \client\bin\ フォルダからクライアント コンピュータにコピーします。

  11. サービスの実行に使用されているのがドメイン アカウントではない場合、クライアント構成ファイルを開き、エンドポイント定義のアドレス値をサービスの新しいアドレスに変更します。アドレスの "localhost" への参照をすべて完全修飾ドメイン名に置き換えます。サービスの実行に使用されているのがドメイン アカウントの場合、サービスに対して Svcutil.exe を実行し、クライアントの構成を再生成します。サンプルの構成ファイルではなく、生成されたファイルを使用します。生成された構成ファイルには、追加の ID 情報があります (また、サービス エンドポイントへの接続に必要なすべての設定が、既定の設定であるにもかかわらず含まれています)。

  12. ブラウザを使用して、サービスにクライアント コンピュータからアクセスできるかどうかをテストします。

  13. クライアント コンピュータで、コマンド プロンプトから Client.exe を起動します。

サンプルの実行後にクリーンアップするには

  • セキュリティの目的で、サンプルの使用が終わったら、ESCalculatorHosted コンポーネントをグローバル アセンブリ キャッシュから削除し、次に ServiceModelHostedSample COM+ アプリケーション、およびアプリケーション ルート ディレクトリ %PROGRAMFILES%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\ を削除してください。

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.