Opérations de service côté serveur

Cette section décrit les opérations de service côté serveur.

Voici la disposition d’une opération de service côté serveur

  • const WS_OPERATION_CONTEXT* contexte : contexte d’opération.
  • Paramètres des opérations de service : paramètres relatifs à l’opération de service.
  • const WS_ASYNC_CONTEXT* asyncContext : contexte asynchrone pour l’exécution asynchrone des opérations de service.
  • WS_ERROR* erreur : objet d’erreur enrichi.
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;
}

Gestion des erreurs

Le côté serveur doit utiliser des erreurs pour fournir des conditions d’erreur au client. Il peut le faire en retournant un HRESULT défaillant et en incorporant l’erreur dans l’objet d’erreur.

Si l’erreur n’est pas définie sur l’objet d’erreur et qu’une erreur HRESULT est retourné, l’infrastructure tente de remettre une erreur au client. Le niveau de détails divulgué au client dans ce cas est contrôlé par la propriété de service WS_SERVICE_PROPERTY_FAULT_DISCLOSURE sur l’hôte de service.

Fin de l’appel

Un appel sur une opération de service côté serveur synchrone est dit être terminé lorsqu’il a retourné le contrôle à l’hôte de service. Pour une opération de service asynchrone, un appel est considéré comme terminé une fois la notification de rappel émise par l’implémentation de l’opération de service.

Durée de vie des appels

Des précautions particulières doivent être prises lors de l’implémentation d’une opération de service côté serveur sur sa durée de vie. La durée de vie d’un appel peut considérablement affecter la durée d’arrêt de l’hôte de service.

Si une opération de service côté serveur est censée bloquer en raison d’une opération liée aux E/S, il est recommandé d’inscrire un rappel d’annulation afin qu’il soit averti si lorsque l’hôte de service est abandonné ou lorsque la connexion sous-jacente est fermée par le client.

Considérations relatives aux opérations de service côté serveur et à la mémoire

Si une opération de service doit allouer de la mémoire pour ses paramètres sortants, elle doit utiliser l’objet WS_HEAP disponible via le WS_OPERATION_CONTEXT.

Exemple : Opération de service et 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;
} 

Valeurs de retour

  • WS_S_ASYNC : l’appel s’est terminé de façon asynchrone.
  • WS_S_END : l’appel s’est terminé avec succès, le serveur ne s’attend à aucun WS_MESSAGE du client au-delà de cet appel. Si une autre WS_MESSAGE est entrée, le serveur doit abandonner le canal.
  • NOERROR/Tout autre HRESULTS « Succès » : l’appel s’est terminé avec succès. Remarque : il est recommandé que l’application ne retourne aucun HRESULT autre que NOERROR pour le succès de l’opération de service.
  • Tout avec une erreur HRESULT : une erreur est renvoyée au client si une erreur est disponible dans WS_ERROR. Sinon, une erreur générique est renvoyée au client. Consultez la discussion sur les erreurs ci-dessus.

Consultez Annulation de l’appel.