サーバー側のサービス操作
このセクションでは、サービス側のサービス操作について説明します。
サーバー側のサービス操作のレイアウトを次に示します。
- 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: 呼び出しは正常に完了しました。 サービス操作を正常に完了するために、アプリケーションは NOERROR 以外の HRESULT を返さないことをお勧めします。
- 失敗した HRESULT を含むすべてのもの: フォールトがクライアントに送信されます (WS_ERRORで使用可能な場合)。 それ以外の場合は、汎用フォールトがクライアントに送り返されます。 上記のフォールトに関する説明を参照してください。
呼び出しの取り消しに関する記事を参照してください。