サーバー側のサービス操作

このセクションでは、サービス側のサービス操作について説明します。

サーバー側のサービス操作のレイアウトを次に示します。

  • const WS_OPERATION_CONTEXT* コンテキスト: 操作 コンテキスト
  • サービス操作パラメーター: サービス操作に関連するパラメーター。
  • const WS_ASYNC_CONTEXT* asyncContext: サービス操作を非同期で実行するための非同期コンテキスト。
  • WS_ERROR* エラー: リッチ エラー オブジェクト。
HRESULT CALLBACK Add(const WS_OPERATION_CONTEXT* context, 
                     ULONG a, ULONG b, ULONG* result, 
                     const WS_ASYNC_CONTEXT* asyncContext, 
                     WS_ERROR* error)
{
    *result = a +b;
    return NOERROR;
}

エラーとエラーの処理

サーバー側では、エラー状態をクライアントに配信するためにエラーを使用する必要があります。 これを行うには、失敗した HRESULT を返し、エラー オブジェクトにエラーを埋め込みます。

エラー オブジェクトにエラーが設定されておらず、エラー HRESULT が返された場合、インフラストラクチャはエラーをクライアントに配信しようとします。 このような場合にクライアントに公開される詳細のレベルは、サービス ホストのサービス プロパティWS_SERVICE_PROPERTY_FAULT_DISCLOSURE制御されます。

通話の完了

同期サーバー側のサービス操作の呼び出しは、どちらかがサービス ホストに制御を返したときに完了したと言われます。 非同期サービス操作の場合、コールバック通知がサービス操作の実装によって発行されると、呼び出しは完了と見なされます。

通話の有効期間

サーバー側のサービス操作を実装する場合は、その有効期間について特別な注意を払う必要があります。 呼び出しの有効期間は、サービス ホストのシャットダウンにかかる時間に大きく影響する可能性があります。

IO バインド操作が原因でサーバー側のサービス操作がブロックされることが予想される場合は、サービス ホストが中止されたとき、または基になる接続がクライアントによって閉じられた場合に通知されるように、キャンセル コールバックを登録することをお勧めします。

サーバー側のサービス操作とメモリに関する考慮事項

サービス操作で送信パラメーターにメモリを割り当てる必要がある場合は、 WS_OPERATION_CONTEXT WS_HEAP 使用できる オブジェクトを使用する必要があります。

例: サービス操作とWS_HEAP

HRESULT CALLBACK ProcessOrder (const WS_OPERATION_CONTEXT* context, const ULONG orderNumber, OrderReceipt** orderReceipt, const WS_ASYNC_CONTEXT* asyncContext, WS_ERROR* error)
{
    WS_HEAP* heap;
    HRESULT hr = WsGetOperationContextProperty (context, WS_OPERATION_CONTEXT_PROPERTY_HEAP, &heap, sizeof(heap), NULL, error);
    if (FAILED(hr))
        return hr;
    hr = WsAlloc(heap, sizeof (OrderReceipt), orderReceipt, error);
    if (FAILED(hr))
        return hr;
    hr = FillInReceipt(*orderReceipt);
    if (FAILED(hr))
        return hr;
    return NOERROR;
} 

戻り値

  • WS_S_ASYNC: 呼び出しは非同期で完了します。
  • WS_S_END: 呼び出しが正常に完了しました。サーバーは、この呼び出しを超えてクライアントからの WS_MESSAGE を想定していません。 別のWS_MESSAGEが入ってくる場合、サーバーはチャネルを中止する必要があります。
  • NOERROR/他のすべての成功 HRESULTS: 呼び出しは正常に完了しました。 サービス操作を正常に完了するために、アプリケーションは HRESULT other then NOERROR を返さないことをお勧めします。
  • エラー HRESULT を含むすべてのもの: WS_ERRORで使用可能な場合、障害はクライアントに返送されます。 それ以外の場合は、汎用エラーがクライアントに返送されます。 上記の障害に関する説明を参照してください。

通話の取り消し」を参照してください。