WCF モニカの COM クライアントと組み合わせての使用
このサンプルでは、Windows Communication Foundation (WCF) サービス モニカを使用して、COM ベースの開発環境 (Microsoft Office Visual Basic for Applications (Office VBA) や Visual Basic 6.0 など) に Web サービスを統合する方法を示します。このサンプルは、クライアント ライブラリ (.dll) をサポートする Windows スクリプト ホストのクライアント (.vbs) と、インターネット インフォメーション サービス (IIS) でホストされるサービス ライブラリ (.dll) とで構成されています。このサービスは電卓サービスの 1 つであり、COM クライアントはサービスの算術演算 (Add、Subtract、Multiply、および Divide) を呼び出します。クライアント アクティビティは、メッセージ ボックス ウィンドウに表示されます。
メモ : |
---|
このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。 |
サービスは、次のように定義された ICalculator
コントラクトを実装します。
[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);
}
このサンプルでは、モニカを使用するための次の 3 つの代替方法を示します。
型指定のあるコントラクト - クライアント コンピュータで COM から参照できる型として登録されます。
WSDL コントラクト - WSDL ドキュメントという形で供給されます。
Metadata Exchange コントラクト – 実行時に Metadata Exchange (MEX) エンドポイントから取得されます。
型指定のあるコントラクト
型指定のあるコントラクトと共にモニカを使用するには、属性が適切に設定されているサービス コントラクトの型を COM に登録する必要があります。最初に、Service Model Metadata Utility Tool (Svcutil.exe) を使用してクライアントを生成する必要があります次のコマンドをクライアント ディレクトリでコマンド プロンプトから実行して、型指定のあるプロキシを生成します。
svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost/servicemodelsamples/service.svc /out:generatedClient.cs
このクラスはプロジェクトに含まれている必要があり、そのプロジェクトは、COM から参照できる署名付きのアセンブリをコンパイル時に生成するように構成されている必要があります。AssemblyInfo.cs ファイルには次の属性を含める必要があります。
[assembly: ComVisible(true)]
プロジェクトをビルドしたら、次のように regasm
を使用して、COM から参照できる型を登録します。
regasm.exe /tlb:CalcProxy.tlb client.dll
作成されたアセンブリは、グローバル アセンブリ キャッシュに追加する必要があります。必要性は強くありませんが、これによってアセンブリを検索するランタイムのプロセスが簡略化されます。グローバル アセンブリ キャッシュにアセンブリを追加するコマンドを次に示します。
gacutil.exe /i client.dll
メモ : |
---|
サービス モニカで必要なのは型の登録だけであり、サービスと通信するためのプロキシは使用されません。 |
ComCalcClient.vbs クライアント アプリケーションは、サービス モニカの構文を使用してサービスのアドレス、バインディング、およびコントラクトを指定し、GetObject
関数を使用してサービスのプロキシを構築します。
Set typedServiceMoniker = GetObject(
"service:address=https://localhost/ServiceModelSamples/service.svc, binding=wsHttpBinding,
contractType={9213C6D2-5A6F-3D26-839B-3BA9B82228D3}")
モニカが使用するパラメータでの指定 :
サービス エンドポイントのアドレス。
エンドポイントとの接続にクライアントが使用する必要のあるバインディング。クライアントの構成ファイルにはカスタム バインディングを定義できますが、この場合はシステム定義の wsHttpBinding を使用します。Windows スクリプト ホストで使用する場合、カスタム バインディングは、Cscript.exe と同じディレクトリにある Cscript.exe.config で定義されます。
エンドポイントでサポートされるコントラクトの型。これは上の手順で生成され、登録された型です。Visual Basic スクリプトには厳密に型指定された COM 環境がないので、コントラクトの識別子を指定する必要があります。この GUID は CalcProxy.tlb からの
interfaceID
で、OLE/COM オブジェクト ビューア (OleView.exe) などの COM ツールを使用して表示できます。Office VBA や Visual Basic 6.0 などの厳密に型指定された環境では、コントラクト パラメータを使用する代わりに、タイプ ライブラリへの明示的な参照を追加してプロキシ オブジェクトの型を宣言することができます。これにより、クライアント アプリケーションの開発中に IntelliSense のサポートも提供されます。
サービス モニカを使用してプロキシ インスタンスを構築しておくと、クライアント アプリケーションはプロキシでメソッドを呼び出すことができます。これにより、対応するサービス操作を呼び出すサービス モニカ インフラストラクチャは次のようになります。
' Call the service operations using the moniker object
WScript.Echo "Typed service moniker: 100 + 15.99 = " & typedServiceMoniker.Add(100, 15.99)
サンプルを実行すると、操作の応答が Windows スクリプト ホストのメッセージ ボックス ウィンドウに表示されます。ここでは、WCF サービスと通信する型指定のあるモニカを使用して、COM の呼び出しを行う COM クライアントを示します。クライアント アプリケーションでは COM が使用されますが、サービスとの通信は Web サービス呼び出しのみで構成されます。
WSDL コントラクト
WSDL コントラクトと共にモニカを使用するには、クライアント ライブラリを登録する必要はありません。ただし、ブラウサを使用してサービスの WSDL エンドポイントにアクセスするなど、帯域外機構を通じてサービスの WSDL コントラクトを取得する必要があります。これにより、モニカは実行時にそのコントラクトにアクセスできるようになります。
ComCalcClient.vbs クライアント アプリケーションは、次のように FileSystemObject
を使用してローカルに保存されている WSDL ファイルにアクセスし、その後 GetObject
関数を再度使用してサービスのプロキシを構築します。
' Open the WSDL contract file and read it all into the wsdlContract string
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("serviceWsdl.xml", ForReading)
wsdlContract = objFile.ReadAll
objFile.Close
' Create a string for the service moniker including the content of the WSDL contract file
wsdlMonikerString = "service:address='https://localhost/ServiceModelSamples/service.svc'"
wsdlMonikerString = wsdlMonikerString + ", binding=WSHttpBinding_ICalculator, bindingNamespace='http://Microsoft.ServiceModel.Samples'"
wsdlMonikerString = wsdlMonikerString + ", wsdl='" & wsdlContract & "'"
wsdlMonikerString = wsdlMonikerString + ", contract=ICalculator, contractNamespace='http://Microsoft.ServiceModel.Samples'"
' Create the service moniker object
Set wsdlServiceMoniker = GetObject(wsdlMonikerString)
モニカが使用するパラメータでの指定 :
サービス エンドポイントのアドレス。
そのエンドポイントと接続するためにクライアントが使用する必要があるバインディングと、そのバインディングが定義されている名前空間。この場合、
wsHttpBinding_ICalculator
が使用されます。コントラクトを定義する WSDL。この場合は、サービスの Wsdl.xml ファイルから読み取られた文字列です。
コントラクトの名前と名前空間。WSDL に複数のコントラクトが含まれている場合があるので、識別情報が必要です。
メモ : 既定では、WCF サービスは、使用される名前空間ごとに異なる WSDL ファイルを生成します。これらのファイルは、WSDL インポート コンストラクタを使用してリンクされます。モニカでは単一の WSDL 定義が想定されているので、サービスはこのサンプルで示すように単一の名前空間を使用するか、または別のファイルを手動でマージする必要があります。
サービス モニカを使用してプロキシ インスタンスを構築しておくと、クライアント アプリケーションはプロキシでメソッドを呼び出すことができます。これにより、対応するサービス操作を呼び出すサービス モニカ インフラストラクチャは次のようになります。
' Call the service operations using the moniker object
WScript.Echo "WSDL service moniker: 145 - 76.54 = " & wsdlServiceMoniker.Subtract(145, 76.54)
サンプルを実行すると、操作の応答が Windows スクリプト ホストのメッセージ ボックス ウィンドウに表示されます。ここでは、WCF サービスと通信するモニカを WSDL コントラクトと共に使用して、COM の呼び出しを行う COM クライアントを示します。
Metadata Exchange コントラクト
MEX コントラクトと共にモニカを使用するには、WSDL コントラクトと同様、クライアント登録は必要ありません。サービスのコントラクトは、実行時に Metadata Exchange を内部使用して取得されます。
ComCalcClient.vbs クライアント アプリケーションは次のように GetObject
関数を再度使用して、サービスのプロキシを構築します。
' Create a string for the service moniker specifying the address to retrieve the service metadata from
mexMonikerString = "service:mexAddress='https://localhost/servicemodelsamples/service.svc/mex'"
mexMonikerString = mexMonikerString + ", address='https://localhost/ServiceModelSamples/service.svc'"
mexMonikerString = mexMonikerString + ", binding=WSHttpBinding_ICalculator, bindingNamespace='http://Microsoft.ServiceModel.Samples'"
mexMonikerString = mexMonikerString + ", contract=ICalculator, contractNamespace='http://Microsoft.ServiceModel.Samples'"
' Create the service moniker object
Set mexServiceMoniker = GetObject(mexMonikerString)
モニカが使用するパラメータでの指定 :
サービスの Metadata Exchange エンドポイントのアドレス。
サービス エンドポイントのアドレス。
そのエンドポイントと接続するためにクライアントが使用する必要があるバインディングと、そのバインディングが定義されている名前空間。この場合、
wsHttpBinding_ICalculator
が使用されます。コントラクトの名前と名前空間。WSDL に複数のコントラクトが含まれている場合があるので、識別情報が必要です。
サービス モニカを使用してプロキシ インスタンスを構築しておくと、クライアント アプリケーションはプロキシでメソッドを呼び出すことができます。これにより、対応するサービス操作を呼び出すサービス モニカ インフラストラクチャは次のようになります。
' Call the service operations using the moniker object
WScript.Echo "MEX service moniker: 9 * 81.25 = " & mexServiceMoniker.Multiply(9, 81.25)
サンプルを実行すると、操作の応答が Windows スクリプト ホストのメッセージ ボックス ウィンドウに表示されます。ここでは、WCF サービスと通信するモニカを MEX コントラクトと共に使用して、COM の呼び出しを行う COM クライアントを示します。
サンプルをセットアップしてビルドするには
「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。
ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
コマンド プロンプトで、言語固有のフォルダにある \client\bin\ フォルダに移動します。Windows Vista または Windows Server 2008 を使用する場合は、コマンド プロンプトを管理者として実行してください。
「regasm.exe /tlb:CalcProxy.tlb client.dll」と入力して、型を COM に登録します。"タイプ ライブラリ エクスポータの警告" が表示されることが予想されますが、ジェネリック型は不要なので問題にはなりません。
「gacutil.exe /i client.dll」と入力して、アセンブリをグローバル アセンブリ キャッシュに追加します。
サンプルを同じコンピュータで実行するには
ブラウザにアドレス https://localhost/servicemodelsamples/service.svc を入力して、サービスにアクセスできるかどうかをテストします。これに応答して、確認ページが表示されます。
言語固有のフォルダの下の \client にある ComCalcClient.vbs を実行します。クライアント アクティビティがメッセージ ボックス ウィンドウに表示されます。
クライアントとサービス間で通信できない場合は、「トラブルシューティングのヒント」を参照してください。
サンプルを別のコンピュータで実行するには
サービス コンピュータで、ServiceModelSamples という仮想ディレクトリを作成します。サンプルに含まれている Setupvroot.bat スクリプトを使用して、ディスク ディレクトリと仮想ディレクトリを作成できます。
サービス プログラム ファイルを %SystemDrive%\Inetpub\wwwroot\servicemodelsamples からサービス コンピュータの ServiceModelSamples 仮想ディレクトリにコピーします。\bin ディレクトリのファイルが含まれていることを確認してください。
クライアント スクリプト ファイルを、言語固有のフォルダにある \client フォルダからクライアント コンピュータにコピーします。
このスクリプト ファイルで、エンドポイント定義のアドレス値をサービスの新しいアドレスに変更します。アドレスの "localhost" への参照をすべて完全修飾ドメイン名に置き換えます。
WSDL ファイルのサービスの Wsdl.xml で、アドレスの "localhost" への参照をすべて完全修飾ドメイン名に置き換えます。
Client.dll ライブラリを、言語固有のフォルダにある \client\bin\ フォルダからクライアント コンピュータのディレクトリにコピーします。
コマンド プロンプトで、クライアント コンピュータのコピー先ディレクトリに移動します。Windows Vista または Windows Server 2008 を使用する場合は、コマンド プロンプトを管理者として実行してください。
「regasm.exe /tlb:CalcProxy.tlb client.dll」と入力して、型を COM に登録します。このコマンドを実行する前に、パスが regasm.exe が含まれるフォルダに設定されていることを確認します。
「gacutil.exe /i client.dll」と入力して、アセンブリをグローバル アセンブリ キャッシュに追加します。このコマンドを実行する前に、パスが gacutil.exe が含まれるフォルダに設定されていることを確認します。
ブラウザを使用して、サービスにクライアント コンピュータからアクセスできるかどうかをテストします。
クライアント コンピュータで ComCalcClient.vbs を起動します。
サンプルの実行後にクリーンアップするには
- セキュリティの目的で、サンプルの使用が終わったら、このセットアップで付与された仮想ディレクトリの定義とアクセス許可を削除してください。
Copyright © 2007 by Microsoft Corporation.All rights reserved.