İstemci Tarafı Hizmet İşlemleri
İstemci tarafı hizmet işleminin düzeni aşağıdadır:
- WS_SERVICE_PROXY* serviceProxy: Çağrı için hizmet ara sunucusu.
- WS_HEAP* yığın: WS_MESSAGEgövde serileştirme ve seri durumdan çıkarma için kullanılan gerekli bir yığın.
- Hizmet İşlemleri Parametreleri: Hizmet işlemiyle ilgili parametreler.
- Çağrı Özellikleri ve bunların sayısı: Çağrı özellikleri dizisi.
- Çağrı özellik sayısı: Çağrı özelliklerinin sayısı.
- WS_ASYNC_CONTEXT asyncContext: Çağrıyı zaman uyumsuz olarak yürütmek için zaman uyumsuz bağlam.
- WS_ERROR hatası: Zengin hata nesnesi.
İstemci Tarafı Hizmet İşlemleri İmzası
typedef HRESULT(CALLBACK *ICalculator_Add)(WS_SERVICE_PROXY* serviceProxy,
WS_HEAP* heap,
ULONG a, ULONG b, ULONG* result,
const WS_CALL_PROPERTY* callProperties,
const ULONG callPropertyCount,
const WS_ASYNC_CONTEXT* asyncContext,
WS_ERROR* error);
İstemci Tarafı Hizmet İşlemleri için BellekLe İlgili Dikkat Edilmesi Gerekenler
Hizmet işlemi çağrısı parametre olarak bir WS_HEAP* alır. Bu, ileti gövdelerinin parametrelere seri hale getirilmesi/seri durumdan çıkarılması için kullanılan gerekli bir parametredir.
Uygulamanın, çağrının başarılı olup olmadığınıWsResetHeap çağrısı yapması gerekir. Çağrı başarılı olduysa ve giden parametreleri varsa, uygulama giden parametrelerle tamamlandıktan hemen sonra WsResetHeap çağırmalıdır.
Uygulama, WsAllocile in ve out parametreleri için bellek ayırmalıdır. Sağlanan işaretçilerin üzerine yazılması için hizmet proxy'sinin bunları yeniden ayırması gerekebilir. Bu tür bir belleği boşaltma girişimi, uygulamanın kilitlenmesine neden olur.
İstemci Tarafı Hizmet İşlemi ve WS_HEAP
HRESULT hr = IProcessOrder_ProcessOrder(serviceProxy, heap, orderNumber, &orderReceipt, NULL, 0, NULL, error);
if(FAILED(hr))
goto error;
hr = ProcessReceipt(orderReceipt);
WsResetHeap(heap);
if(FAILED(hr))
goto error;
hr = IProcessOrder_CompleteOrder(serviceProxy, heap, orderNumber, &orderMemo, NULL, 0, NULL, error);
if(FAILED(hr))
goto error;
hr = ProcessMemo(orderMemo);
WsResetHeap(heap);
if(FAILED(hr))
goto error;
Hata parametresi
Uygulama her zaman hata parametresini şu şekilde geçirmelidir:
- Hizmet işlemi çağrısı sırasında bir hata oluşursa zengin hata bilgilerini alın.
- Hizmet bir hatayı geri döndürdüyse hata nesnesini alın. Hata, hata nesnesinde yer alır. Bu durumda, hizmet işleminden döndürülen HRESULT değeri WS_E_ENDPOINT_FAULT_RECEIVED (bkz. Windows Web Hizmetleri Dönüş Değerleri).
İstemci Tarafı Hizmet İşlemleri için Çağrı Özellikleri
Çağrı özellikleri, uygulamanın belirli bir çağrı için özel ayarlar belirtmesine olanak sağlar. Şu anda hizmet modeliyle yalnızca bir çağrı özelliği kullanılabilir, WS_CALL_PROPERTY_CALL_ID.
WS_CALL_PROPERTY callProperties[1] = {0};
callProperties[0].id = WS_CALL_PROPERTY_CALL_ID;
callProperties[0].value = 5;
HRESULT hr = IProcessOrder_ProcessOrder(serviceProxy, heap, orderNumber, &orderReceipt, callProperties, WsCountOf(callProperties), NULL, error);
if(FAILED(hr))
goto error;
//:
//:
hr = IProcessOrder_CompleteOrder(serviceProxy, heap, orderNumber, &orderReceipt, callProperties, WsCountOf(callProperties), NULL, error);
if(FAILED(hr))
goto error;
//:
//:
//:
// On a separate thread
// In this case both the calls belong to call group 5, and will abandon as a result of the call to WsAbandonCall.
hr = WsAbandonCall(serviceProxy, 5, error);
Aramayı Bırakma
Denetimi uygulamaya geri döndürmek için genellikle bir çağrının sonuçlarından vazgeçmek istenir; böylece gerçek çağrı tamamlama altyapı tarafından işlenir. Hizmet proxy'si bu tesisi WsAbandonCallaracılığıyla sağlar.
Çağıranın denetimine hemen geri verilemeyeceğini unutmayın; hizmet proxy çalışma zamanının verdiği tek garanti, denetimi çağırana geri vermeden önce G/Ç bağlı işlemlerin tamamlanmasını beklememesidir.
İstemci tarafı hizmet işlemindeki çağrılar, WsAbandonCallçağrısı yoluyla terk edilebilir. Bir hizmet ara sunucusu ve bir çağrı kimliği alır. Çağrı kimliği, bir hizmet işlemindeki çağrı özelliklerinin bir parçası olarak verilir.
Çağrı kimliği 0 ise, hizmet proxy'si bu örnekte bekleyen tüm çağrıları bırakır.
Arama Zaman Aşımları
Varsayılan olarak bir hizmet proxy'si her çağrı için 30 saniyelik zaman aşımına sahiptir. Bir çağrıdaki zaman aşımı, WsCreateServiceProxyaracılığıyla bir hizmet proxy'si oluşturulurken WS_PROXY_PROPERTY_CALL_TIMEOUT hizmet ara sunucusu özelliğiyle değiştirilebilir.
Zaman aşımına ulaşıldıktan sonra çağrı terk edilir.
Dönüş Değerleri
HRESULT değerleri tüm başarılar başarılı olarak değerlendirilmeli ve tüm hata değerleri hata olarak ele alınmalıdır. Aşağıdakiler, bir uygulamanın bekleyebilecekleri HRESULT değerlerinden bazılarıdır:
- WS_S_ASYNC: Çağrı zaman uyumsuz olarak tamamlanır.
- NOERROR: Arama başarıyla tamamlandı.
- WS_E_OPERATION_ABANDONED: Çağrı bırakıldı. Hata nesnesi, bırakmanın nedenini içerir.
- WS_E_INVALID_OPERATION: Hizmet proxy'si çağrı yapmak için uygun durumda değil, hizmet ara sunucusunun durumunu bulmak için hizmet ara sunucusu durumunu denetleyin.
Dönüş değerlerinin tam listesi için bkz. Windows Web Services Dönüş Değerleri.
Kod Örnekleri
Kod örnekleri için aşağıdakilere bakın:
- CallAbandonExample
- WsAbandonCall