COM+ 統合 : Web によるホスト
このサンプルは、COM+ アプリケーションのインターフェイスを Windows Communication Foundation (WCF) サービスとして公開する手順と、公開されたサービスを WCF クライアントから呼び出す手順を示します。このサンプルは、クライアント コンソール プログラム (.exe) と COM+ 内に登録された Enterprise Services ライブラリ アプリケーション (.dll) で構成されています。
メモ : |
---|
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。 |
メモ : |
---|
このサンプルの Visual Basic バージョンは、サーバー アプリケーションとして構成し、64 ビット版 Windows オペレーティング システムで動作するプロセス以外でホストする必要があります。サーバー アプリケーションとしてサンプルを構成する方法の詳細については、「COM+ アプリケーションの構成」を参照してください。 |
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);
}
このインターフェイスは、要求/応答通信パターンを定義するサービス コントラクトとして公開されています。クライアントは算術演算を同期要求し、サービスとその構成コンポーネントは結果を添えて応答します。クライアント アクティビティは、コンソール ウィンドウに表示されます。
サービスはプロセス内でインターネット インフォメーション サービス (IIS) によってホストされ、そのサービスに最初に送信されたメッセージによってアクティブになります。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;
}
}
メモ : |
---|
このクラスは ServiceModel 固有のコードを含まない一般的なエンタープライズ サービス アセンブリで、エンタープライズ サービスの属性が設定され、署名されてグローバル アセンブリ キャッシュ (GAC) に追加されます。 |
選択したインターフェイスのサポート サービスを追加するには、COM+ Service Model Configuration Tool (ComSvcConfig.exe) を使用します。この実行に使用する構文は次のとおりです。
ComSvcConfig.exe /install /application:ServiceModelSample /contract:ServiceModelSample.ESCalculator,ICalculator hosting:was /webDirectory:ServiceModelSamples /mex /verbose
この場合、ツールにより ServiceModelSample.ESCalculator コンポーネントの ICalculator
インターフェイスが追加されます。このコンポーネントは ServiceModelSample アプリケーション内にあります。サービスは、ServiceModelSample 仮想ディレクトリ内で IIS によってホストされます。追加されたサービスは、サービスとの通信に使用する単一のエンドポイントを公開します。既定では、サービスとの通信に使用するエンドポイント アドレスはコンポーネントの ProgID によって構成されます (つまり https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc となります)。ただし、このサービスのエンドポイント アドレスは、.svc サービス ファイルの名前を変更することによって変更できます。このツールにより、サービスのバインディングに使用する構成が Web.config ファイルに追加されます。サービスのバインディングの構成は既定では標準の wsHttpBinding バインディングで、SOAP 1.2 規格と Web Services 規格を使用した HTTP 通信を提供し、アドレス指定とセキュリティをサポートします。
また、このツールにより、Metadata Exchange (MEX) エンドポイントが https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc/mex で公開されます。さらに、HTTP GET を使用してブラウザから WSDL メタデータにアクセスする機能も https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc?wsdl で公開されます。メタデータ機能を無効にするには、/mex ツール オプションを省略します。
サービス コントラクトは ICalculator
インターフェイスから直接派生し、次の ServiceContract の定義と同等です。
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
クライアントは、コントラクトとの通信に、Service Metadata Utility Tool (Svcutil.exe) によって生成されたクライアントを使用します。クライアントは、generatedClient.cs ファイルに含まれています。このユーティリティは、サービスが使用するメタデータを取得し、コントラクト型との通信に使用するクライアントを生成します。プロキシ コードを生成するには、ホストされるサービスを利用できる必要があります。このサービスは、更新されたメタデータの取得に使用されるためです。次のコマンドをクライアント ディレクトリでコマンド プロンプトから実行して、型指定のあるプロキシを生成します。
svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc/mex /out:generatedClient.cs
特定のコントラクトでの通信に使用するために生成されたクライアントの場合、適切なアドレスとバインディングを構成して、指定のサービス エンドポイントにアクセスできます。サービスと同様、クライアントは構成ファイル (App.config) を使用して、通信するエンドポイントを指定します。クライアント エンドポイント構成は、構成名、サービス エンドポイントの絶対アドレス、バインディング、およびコントラクトで構成されます。
<system.serviceModel>
<client>
<endpoint
address="https://localhost/ServiceModelSamples/servicemodelsample.escalculator.svc/ICalculator"
binding="wsHttpBinding"
bindingConfiguration="comNonTransactionalBinding"
contract="ICalculator" />
</client>
<bindings>
<wsHttpBinding>
<binding name="comNonTransactionalBinding" >
<reliableSession enabled="true"/>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
クライアント実装は、生成されたクライアントのインスタンスをコンストラクトします。これをサービスとの通信を開始するのに使用できます。
// Create a client.
CalculatorClient client = new CalculatorClient();
// 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);
// Call the Divide service operation.
value1 = 22.00D;
value2 = 7.00D;
result = client.Divide(value1, value2);
Console.WriteLine("Divide({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
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.
サンプルをセットアップしてビルドするには
「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。
ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
\InetPub\wwwroot\ServiceModelSamples と bin サブディレクトリが空であることを確認します。
コマンド プロンプトで、サンプルの service\bin フォルダに移動します。Windows Vista または Windows Server 2008 を使用する場合は、コマンド プロンプトを管理者として実行してください。
「gacutil.exe /i ESCalculator.dll」と入力して、アセンブリをグローバル アセンブリ キャッシュに追加します。現在のパス設定で Gacutil.exe にアクセスできることを確認します。
「regsvcs.exe ESCalculator.dll」と入力して、アセンブリのコンポーネントと ServiceModelSample アプリケーションを COM+ に登録します。現在のパス設定で Regsvcs.exe にアクセスできることを確認します。
「ComSvcConfig.exe /install /application:ServiceModelSample /contract:"ServiceModelSample.ESCalculator,ICalculator" /hosting:was /webDirectory:ServiceModelSamples /mex /verbose」と入力して、インターフェイスを IIS でホストされるサービスとして公開します。
現在のパス設定で ComSvcConfig.exe にアクセスできることを確認します。
サンプルを同じコンピュータで実行するには
ブラウザにアドレス https://localhost/ServiceModelSamples/ServiceModelSample.ESCalculator.svc を入力して、サービスにアクセスできることを確認します。これに対して確認ページが表示されます。
言語固有のフォルダの下の \client\bin\ にある Client.exe を実行します。クライアント アクティビティがクライアント コンソール ウィンドウに表示されます。
クライアントとサービス間で通信できない場合は、「トラブルシューティングのヒント」を参照してください。
メモ : このサンプルでは、コンソール アプリケーション クライアント プログラムをビルドします。出力を表示するには、コマンド プロンプトで起動する必要があります。
サンプルを別のコンピュータで実行するには
サービス コンピュータで、ServiceModelSamples という仮想ディレクトリを作成します。「仮想ディレクトリのセットアップ手順」に含まれている Setupvroot.bat スクリプトを使用して、ディスク ディレクトリと仮想ディレクトリを作成できます。
ファイル ESCalculator.dll を service\bin ディレクトリからサービス コンピュータのディレクトリにコピーします。
コマンド プロンプトで、サービス コンピュータのコピー先ディレクトリに移動します。Windows Vista または Windows Server 2008 を使用する場合は、コマンド プロンプトを管理者として実行してください。
サービス コンピュータで「gacutil.exe /i ESCalculator.dll」と入力して、アセンブリをグローバル アセンブリ キャッシュに追加します。
サービス コンピュータで「regsvcs.exe ESCalculator.dll」と入力して、アセンブリのコンポーネントと ServiceModelSample アプリケーションを COM+ に登録します。
サービス コンピュータで「ComSvcConfig.exe /install /application:ServiceModelSample /contract:"ServiceModelSample.ESCalculator,ICalculator" /hosting:was /webDirectory:ServiceModelSamples /mex /verbose」と入力して、コントラクトを IIS でホストされるサービスとして公開します。
クライアント プログラム ファイルを、言語固有のフォルダにある \client\bin\ フォルダからクライアント コンピュータにコピーします。
クライアントの構成ファイルで、エンドポイント定義のアドレス値をサービスの新しいアドレスに合わせます。アドレスの "localhost" への参照をすべて完全修飾ドメイン名に置き換えます。
ブラウザを使用して、サービスにクライアント コンピュータからアクセスできるかどうかを確認します。
クライアント コンピュータで、コマンド プロンプトから Client.exe を起動します。
サンプルの実行後にクリーンアップするには
Windows Vista または Windows Server 2008 を使用する場合は、コマンド プロンプトを管理者として実行してください。「ComSvcConfig.exe/u/application:ServiceModelSample/contract:ServiceModelSample.ESCalculator,ICalculator」と入力して、COM+ 統合をアンインストールします。
「regsvcs.exe /u ESCalculator.dll」と入力して、COM+ からアプリケーションをアンインストールします。
「gacutil.exe /u ESCalculator」と入力して、グローバル アセンブリ キャッシュからコンポーネントを削除します。
Copyright © 2007 by Microsoft Corporation.All rights reserved.