Share via


クライアントの作成

Web サービス用のクライアントの作成は、 サービス モデル API と WsUtil.exe ツールによって WWSAPI で大幅に簡略化されています。 サービス モデルは、クライアントが C メソッド呼び出しとしてチャネル経由でメッセージを送受信できるようにする API を提供します。 WsUtil ツールは、クライアントを実装するためのヘッダーとヘルパーを生成します。 これらのヘッダーには、ターゲット Web サービスによって提供されるサービスを表す C 関数の型と関数プロトタイプが含まれます。 ヘルパーは、サービスのバインディング情報と エンドポイント アドレス を含むサービス プロキシを作成するために使用されます。

WsUtil を使用したヘッダーとヘルパーの生成

ヘッダーとヘルパーを生成するために、WsUtil はターゲット サービス (wsdl ファイルと xsd ファイル) のメタデータ ファイルを開いて読み取り、ヘッダーに変換します。そのため、たとえば Windows Communication Foundation の一部である SvcUtil を使用して、ターゲット サービスのメタデータ ファイルを事前に取得する必要があります。 セキュリティ上の理由から、これらのファイルのコピーは信頼できるものであることが不可欠です。 (詳細については、「 WsUtil コンパイラ ツール 」トピックの「セキュリティ」セクションを参照してください)。

WsUtil を実行するには、サービスの WSDL ファイルと XSD ファイルが独自のディレクトリにある場合は、次のコマンド ライン構文を使用します WsUtil.exe *.wsdl *.xsd。 または、フル ネームでファイルを指定することもできます。

WsUtil では通常、メタデータ ファイルごとにヘッダーと C ファイルの 2 つのファイルが生成されます。 これらのファイルをコーディング プロジェクトに追加し、#include ステートメントを使用してクライアントのコードに含めます。 (XSD ファイルは型を表し、WSDL ファイルは操作を表します)。

サービス プロキシの作成

WsUtil によって生成されるヘッダーには、必要なバインディングを使用してサービス プロキシを作成するためのヘルパー ルーチンが含まれています。 このルーチンは、生成されたヘッダー ファイルの "ポリシー ヘルパー ルーチン" セクションに含まれています。 たとえば、 httpcalculatorclientexample の例に示されている電卓サービスの生成されたヘッダーには、次の関数プロトタイプが含まれます。

HRESULT BasicHttpBinding_ICalculator_CreateServiceProxy(
    __in_opt WS_HTTP_BINDING_TEMPLATE* templateValue,
    __in_ecount_opt(proxyPropertyCount) const WS_PROXY_PROPERTY* proxyProperties,
    __in const ULONG proxyPropertyCount,
    __deref_out_opt WS_SERVICE_PROXY** _serviceProxy,
    __in_opt WS_ERROR* error);

このヘルパーをコードに組み込み、 WS_SERVICE_PROXY ハンドルを渡して、作成されたサービス プロキシにハンドルを受け取ります。 サービス プロキシ ハンドルとエラー オブジェクトのみが関数に渡される最も簡単なシナリオでは、呼び出しは次のようになります。

hr = BasicHttpBinding_ICalculator_CreateServiceProxy(
            NULL,
            NULL,
            0,
            &serviceProxy,
            error);

サービス プロキシのアドレス部分を作成するには、 WsOpenServiceProxy を呼び出し、サービス プロキシへのハンドルと、接続先のサービス エンドポイント アドレスを含む WS_ENDPOINT_ADDRESS へのポインターを指定します。

関数プロトタイプを使用したクライアントの実装

サービス WSDL ファイルから生成されたヘッダーには、Web サービスから利用可能なサービスと、必要なバインドに固有のサービスを表す C 関数プロトタイプも含まれています。 たとえば、HttpCalculatorServiceExample に示されている電卓サービス用に生成されたヘッダーには、そのサービスの乗算操作の次のプロトタイプが含まれます。

HRESULT BasicHttpBinding_ICalculator_Multiply(
    __in WS_SERVICE_PROXY* _serviceProxy,
    __in double n1,
    __in double n2,
    __out double* MultiplyResult,
    __in WS_HEAP* _heap,
    __in_ecount_opt(_callPropertyCount) const WS_CALL_PROPERTY* _callProperties,
    __in const ULONG _callPropertyCount,
    __in_opt const WS_ASYNC_CONTEXT* _asyncContext,
    __in_opt WS_ERROR* _error);

プロトタイプをコピーし、クライアントで関数呼び出しをコーディングするためのテンプレートとして使用できます。各ケースでは、ハンドルをサービス プロキシに渡します。 サービス プロキシの使用が完了したら、 WsCloseServiceProxy を呼び出します。