伺服器端服務作業
本節描述服務端服務作業。
以下是伺服器端服務作業的配置
- 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有可用的錯誤,則會將錯誤傳回用戶端。 否則,泛型錯誤會傳回用戶端。 請參閱上述錯誤討論。
請參閱通話 取消 。