クライアント側のサービス操作
クライアント側サービス操作のレイアウトを次に示します。
- WS_SERVICE_PROXY* serviceProxy: 呼び出しの サービス プロキシ 。
- WS_HEAP* ヒープ: WS_MESSAGEの本文のシリアル化と逆シリアル化に使用される必要なヒープ。
- サービス操作パラメーター: サービス操作に関連するパラメーター。
- 呼び出しプロパティとその数: 呼び出しプロパティの配列。
- 呼び出し プロパティの数: 呼び出しプロパティの数。
- WS_ASYNC_CONTEXT asyncContext: 非同期で呼び出しを実行するための非同期コンテキスト。
- WS_ERROR エラー: リッチ エラー オブジェクト。
クライアント側サービス操作の署名
typedef HRESULT(CALLBACK *ICalculator_Add)(WS_SERVICE_PROXY* serviceProxy,
WS_HEAP* heap,
ULONG a, ULONG b, ULONG* result,
const WS_CALL_PROPERTY* callProperties,
const ULONG callPropertyCount,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
クライアント側サービス操作のメモリに関する考慮事項
サービス操作の呼び出しは、 パラメーターとしてWS_HEAP* を受け取ります。 これは、メッセージ本文をパラメーターにシリアル化/逆シリアル化するために使用される必須のパラメーターです。
アプリケーションは、呼び出しが成功したかどうかにかかわらず 、WsResetHeap を呼び出す必要があります。 呼び出しが成功し、送信パラメーターがある場合、アプリケーションは送信パラメーターを使用して終了した直後に WsResetHeap を呼び出す必要があります。
アプリケーションでは、 WsAlloc を使用して in パラメーターと out パラメーターにメモリを割り当てる必要があります。 指定されたポインターが上書きされるように、サービス プロキシで再割り当てが必要になる場合があります。 このようなメモリを解放しようとすると、アプリケーションがクラッシュします。
クライアント側のサービス操作とWS_HEAP
HRESULT hr = IProcessOrder_ProcessOrder(serviceProxy, heap, orderNumber, &orderReceipt, NULL, 0, NULL, error);
if(FAILED(hr))
goto error;
hr = ProcessReceipt(orderReceipt);
WsResetHeap(heap);
if(FAILED(hr))
goto error;
hr = IProcessOrder_CompleteOrder(serviceProxy, heap, orderNumber, &orderMemo, NULL, 0, NULL, error);
if(FAILED(hr))
goto error;
hr = ProcessMemo(orderMemo);
WsResetHeap(heap);
if(FAILED(hr))
goto error;
Error パラメーター
アプリケーションでは、常に error パラメーターを次の値に渡す必要があります。
- サービス操作の呼び出し中にエラーが発生した場合は、豊富なエラー情報を取得します。
- サービスがエラーを返した場合は、fault オブジェクトを取得します。 エラーは error オブジェクトに含まれています。 この場合、サービス操作から返される HRESULT 値は WS_E_ENDPOINT_FAULT_RECEIVED されます ( 「Windows Web サービスの戻り値」を参照)。
クライアント側サービス操作の呼び出しプロパティ
呼び出しプロパティを使用すると、アプリケーションは特定の呼び出しのカスタム設定を指定できます。 現在、サービス モデルで使用できる呼び出しプロパティは 1 つだけ です(WS_CALL_PROPERTY_CALL_ID)。
WS_CALL_PROPERTY callProperties[1] = {0};
callProperties[0].id = WS_CALL_PROPERTY_CALL_ID;
callProperties[0].value = 5;
HRESULT hr = IProcessOrder_ProcessOrder(serviceProxy, heap, orderNumber, &orderReceipt, callProperties, WsCountOf(callProperties), NULL, error);
if(FAILED(hr))
goto error;
//:
//:
hr = IProcessOrder_CompleteOrder(serviceProxy, heap, orderNumber, &orderReceipt, callProperties, WsCountOf(callProperties), NULL, error);
if(FAILED(hr))
goto error;
//:
//:
//:
// On a separate thread
// In this case both the calls belong to call group 5, and will abandon as a result of the call to WsAbandonCall.
hr = WsAbandonCall(serviceProxy, 5, error);
通話の破棄
多くの場合、実際の呼び出しの完了がインフラストラクチャによって処理されるように、アプリケーションに制御を放棄するために、呼び出しの結果を破棄することをお勧めします。 サービス プロキシは、 WsAbandonCall を介してこの機能を提供します。
呼び出し元に対する制御はすぐには返されない場合があることに注意してください。サービス プロキシ ランタイムが提供する唯一の保証は、I/O バインド操作が完了するまで待機しないと呼び出し元に制御を返すということです。
クライアント側サービス操作の呼び出しは、 WsAbandonCall の呼び出しによって破棄できます。 サービス プロキシと呼び出し ID を受け取ります。呼び出し ID は、サービス操作の呼び出しプロパティの一部として指定されます。
呼び出し ID が 0 の場合、サービス プロキシはそのインスタンスで保留中のすべての呼び出しを破棄します。
呼び出しのタイムアウト
既定では、サービス プロキシは呼び出しごとに 30 秒のタイムアウトになります。 呼び出しのタイムアウトは、WsCreateServiceProxyを使用してサービス プロキシを作成するときに、サービス プロキシ プロパティWS_PROXY_PROPERTY_CALL_TIMEOUT変更できます。
タイムアウトに達すると、呼び出しは破棄されます。
戻り値
成功した HRESULT 値はすべて成功として扱う必要があり、すべての失敗値は失敗として扱う必要があります。 アプリケーションで期待できる HRESULT 値の一部を次に示します。
- WS_S_ASYNC: 呼び出しは非同期的に完了します。
- NOERROR: 呼び出しが正常に完了しました。
- WS_E_OPERATION_ABANDONED: 呼び出しは破棄されました。 エラー オブジェクトには、破棄の理由が含まれています。
- WS_E_INVALID_OPERATION: サービス プロキシが呼び出しを行うために適切な状態ではなく、サービス プロキシの状態をチェックして、サービス プロキシの状態を把握します。
戻り値の完全な一覧については、「 Windows Web サービスの戻り値」を参照してください。
コード例
コード例については、次を参照してください。