次の方法で共有


WCF サービスのサービス プロキシを手動で作成する

Windows Communication Foundation (WCF) サービスのクライアント サービス プロキシを作成する最も簡単な方法は、「クライアント の作成」で説明されているように、WsUtil ツールを使用した サービス モデル レイヤーです。 ただし、必要に応じて、サービス プロキシを手動で作成することもできます。 この API には、サービス プロキシを作成するための WsCreateServiceProxy 関数と、WCF との相互運用に必要なプロパティを設定するための構造体、列挙型などが含まれます。

WCF には、特定の使用シナリオを対象とする標準バインドが多数用意されています。 接続しようとしているサービスをどのバインドに使用するかによって、サービス プロキシがサービスと通信するためにカスタマイズする必要があるチャネル プロパティが決まります。

WCF の WSHttpBinding 用のサービス プロキシの作成

WSHttpBinding は、メインラインのインターネット Web サービス シナリオ用です。 新しい SOAP バージョン 1.2 と WS-Addressing バージョン 1.0 を使用し、パブリック HTTP および HTTPS トランスポートを介して幅広いセキュリティ設定を有効にします。 WWSAPI には WSHttpBinding (または WCF 標準バインド) に相当するものはありませんが、既定の SOAP バージョン、WS-Addressing バージョン、エンコード形式は WSHttpBinding のものと一致するため、WSHttpBinding を使用するサービスのサービス プロキシの作成は簡単です。 たとえば、セキュリティなしで WSHttpBinding エンドポイントと通信するサービス プロキシを作成するには、次のスニペットのようなコードを使用するだけです (変数宣言、ヒープとエラーの作成は省略されます)。 WsCreateServiceProxy 関数の呼び出しでチャネル プロパティまたはセキュリティの説明が指定されていないことに注意してください。

// Create the proxy

hr = WsCreateServiceProxy(
        WS_CHANNEL_TYPE_REQUEST, 
        WS_HTTP_CHANNEL_BINDING, 
        NULL, // security description
        NULL, // proxy properties
        0, // proxy property count
        NULL, // channel properties
        0, // channel property count
        &proxy, 
        error);

この関数は、サービス プロキシを作成し、serviceProxy パラメーター (上記の関数呼び出し&プロキシ) でポインターを返します。

WCF の BasicHttpBinding 用のサービス プロキシの作成

ただし、BasicHttpBinding バインドを使用する WCF サービスのサービス プロキシを手動で作成する場合は、チャネルの SOAP バージョンと WS-Addressing プロパティを設定する必要があります。 これは、WWSAPI の既定値は SOAP バージョン 1.2 と WS-Addressing 1.0 であるためです。 一方、WCF の BasicHttpBinding では SOAP バージョン 1.1 が使用され、WS アドレス指定は使用されません。

チャネルの SOAP バージョンと WS-Addrssing プロパティを設定するには、チャネル のプロパティと関連情報を保持する WS_CHANNEL_PROPERTY 構造体の配列を宣言します。

WS_CHANNEL_PROPERTY channelProperties[4]; // Array to hold up to 4 channel properties

ULONG channelPropertyCount = 0; // Count of properties set
 
WS_ENVELOPE_VERSION soapVersion = WS_ENVELOPE_VERSION_SOAP_1_1; // Set required SOAP version
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ENVELOPE_VERSION; // Type of first channel property
channelProperties[channelPropertyCount].value = &soapVersion; // Address of the SOAP version value
channelProperties[channelPropertyCount].valueSize = sizeof(soapVersion); // Size of the value
channelPropertyCount++; // Increment property count
 
WS_ADDRESSING_VERSION addressingVersion = WS_ADDRESSING_VERSION_TRANSPORT; // Set required WS-Addressing value
channelProperties[channelPropertyCount].id = WS_CHANNEL_PROPERTY_ADDRESSING_VERSION; // Type of second channel property
channelProperties[channelPropertyCount].value = &addressingVersion ; // Address of the WS-Addressing value
channelProperties[channelPropertyCount].valueSize = sizeof(addressingVersion ); // Size of the value
channelPropertyCount++; // Increment property count
 
// add more channel properties here

次に、チャネル プロパティの配列 (channelProperties) とプロパティの数 (channelPropertyCount) を WsCreateServiceProxy (チャネル レイヤーで作業している場合は wsCreateChannel) に渡します。

// Create the proxy

hr = WsCreateServiceProxy(
        WS_CHANNEL_TYPE_REQUEST, 
        WS_HTTP_CHANNEL_BINDING, 
        NULL, // security description
        NULL, // proxy properties
        0, // proxy property count
        channelProperties, // channel properties
        channelPropertyCount, // channel property count
        &proxy, 
        error);

プロパティを保持するように宣言した配列は WsCreateServiceProxy コピーされるため、関数を呼び出した直後にプロパティ配列のメモリを解放できます。 また、(上記のコード スニペットのように) スタックからメモリを割り当てる場合は、呼び出しの直後に関数から戻すこともできます。

その他のバインド

さらに、WWSAPI には、NetTcpBinding や WSFederationHttpBinding などの他のバインディングを使用して WCF サービスと通信するためのサービス プロキシを作成するためのメカニズムが用意されています。 これらのバインドの多くは、セキュリティ記述子などの追加のチャネル プロパティを設定する必要があります。 その他のバインディングの使用例については、「Windows Web サービスの例」セクション、特に「TCP チャネルレイヤーの例」、HTTP チャネルレイヤーの例、および セキュリティ チャネルレイヤーの例 サブセクションを参照してください。