Operasi Layanan Sisi Server

Bagian ini menjelaskan operasi layanan sisi layanan.

Berikut ini adalah tata letak operasi layanan sisi server

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;
}

Penanganan Kesalahan dan Kesalahan

Sisi server harus menggunakan kesalahan untuk memberikan kondisi kesalahan kepada klien. Ini dapat melakukannya dengan mengembalikan HRESULT yang gagal dan menyematkan kesalahan dalam objek kesalahan.

Jika kesalahan tidak diatur pada objek kesalahan dan kegagalan HRESULT dikembalikan, infrastruktur akan mencoba mengirimkan kesalahan kembali ke klien. Tingkat detail yang diungkapkan kepada klien dalam kasus seperti itu dikendalikan oleh properti layanan WS_SERVICE_PROPERTY_FAULT_DISCLOSURE pada Host Layanan.

Penyelesaian Panggilan

Panggilan pada operasi layanan sisi server sinkron dikatakan selesai ketika telah mengembalikan kontrol kembali ke host layanan. Untuk operasi layanan asinkron, panggilan dianggap selesai setelah pemberitahuan panggilan balik dikeluarkan oleh implementasi operasi layanan.

Masa Pakai Panggilan

Perawatan khusus harus dilakukan saat menerapkan operasi layanan sisi server tentang masa pakainya. Masa pakai panggilan dapat sangat memengaruhi berapa lama host layanan perlu dimatikan.

Jika operasi layanan sisi server diharapkan untuk memblokir karena beberapa operasi terikat IO, disarankan agar mendaftarkan panggilan balik pembatalan sehingga diberi tahu jika ketika host layanan dibatalkan, atau ketika koneksi yang mendasar ditutup oleh klien.

Operasi layanan sisi server dan pertimbangan memori

Jika operasi layanan perlu mengalokasikan memori untuk parameter keluarnya, operasi tersebut harus menggunakan objek WS_HEAP tersedia untuknya melalui WS_OPERATION_CONTEXT.

Contoh: Operasi Layanan dan 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;
} 

Nilai yang Dikembalikan

  • WS_S_ASYNC: Panggilan akan diselesaikan asinkron.
  • WS_S_END: Panggilan berhasil diselesaikan, server tidak mengharapkan WS_MESSAGE apa pun dari klien di luar panggilan ini. Jika WS_MESSAGE lain masuk maka server harus membatalkan saluran.
  • NOERROR/Semua HRESULTS keberhasilan lainnya: Panggilan berhasil diselesaikan. Perhatikan bahwa disarankan agar aplikasi tidak mengembalikan HRESULT lainnya maka NOERROR untuk keberhasilan penyelesaian operasi layanan.
  • Segala sesuatu dengan kegagalan HRESULT: Kesalahan dikirim kembali ke klien jika tersedia di WS_ERROR. Jika tidak, kesalahan umum dikirim kembali ke klien. Lihat diskusi kesalahan di atas.

Lihat, Pembatalan panggilan.