Share via


伺服器端服務作業

本節描述服務端服務作業。

以下是伺服器端服務作業的配置

  • 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有可用的錯誤,則會將錯誤傳回用戶端。 否則,泛型錯誤會傳回用戶端。 請參閱上述錯誤討論。

請參閱通話 取消