WCF サービスのサービス プロキシを手動で作成する
Windows Communication Foundation (WCF) サービスのクライアント サービス プロキシを作成する最も簡単な方法は、「クライアントの作成」トピックで説明されているように、WsUtil ツールを使用したサービス モデル レイヤーです。 ただし、必要に応じて、サービス プロキシを手動で作成することもできます。 この API には、サービス プロキシを作成するための WsCreateServiceProxy 関数と、WCF との相互運用に必要なプロパティを設定するための構造体、列挙型などが含まれます。
WCF には、それぞれ特定の使用シナリオを対象とする多数の標準バインディングが用意されています。 接続しようとしているサービスをどのバインドに使用するかによって、サービス プロキシがサービスと通信するためにカスタマイズする必要があるチャネル プロパティが決まります。
WCF の WSHttpBinding 用のサービス プロキシの作成
WSHttpBinding は、メインラインのインターネット Web サービス シナリオ用です。 新しい SOAP バージョン 1.2 とバージョン 1.0 WS-Addressingを使用し、パブリック 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 チャネル層の例、およびセキュリティ チャネル層の例のサブセクションを参照してください。