Expected Exceptions
Cet exemple montre comment intercepter des exceptions attendues lors de l'utilisation d'un client typé. Cet exemple est basé sur Getting Started, exemple qui implémente un service de calculatrice. Dans cet exemple, le client est une application console (.exe) et le service est hébergé par les services IIS (Internet Information Services).
Remarque : |
---|
La procédure d'installation ainsi que les instructions de génération relatives à cet exemple figurent en fin de rubrique. |
Cet exemple illustre l'interception et la gestion des deux types d'exception attendues que les programmes corrects doivent gérer : TimeoutException et CommunicationException.
Les exceptions levées depuis les méthodes de communication sur un client Windows Communication Foundation (WCF) sont soit attendues, soit inattendues. Les exceptions inattendues incluent les pannes catastrophiques comme OutOfMemoryException et les erreurs de programmation comme ArgumentNullException ou InvalidOperationException. En général, il n'y a aucune utilité à gérer des erreurs inattendues, donc vous ne devez pas les intercepter lors de l'appel à une méthode de communication du client WCF.
Les exceptions attendues depuis les méthodes de communication sur un client WCF incluent TimeoutException, CommunicationException et toute classe dérivée de CommunicationException. Celles-ci indiquent un problème pendant la communication qui peut être géré sans risque en abandonnant le client WCF et en signalant un échec de communication. Étant donné que des facteurs externes peuvent provoquer ces erreurs dans toute application, les applications correctes doivent intercepter ces exceptions et récupérer lorsqu'elles se produisent.
Il existe plusieurs classes dérivées de CommunicationException qu'un client peut lever. Dans certains cas, les applications en interceptent et procèdent à un traitement spécial, mais laissent les autres être traitées comme CommunicationException. Cela peut être accompli en interceptant le type d'exception plus spécifique en premier, puis en interceptant CommunicationException dans une clause « catch » ultérieure.
Le code qui appelle une méthode de communication cliente doit intercepter TimeoutException et CommunicationException. Pour gérer de telles erreurs, il est possible d'abandonner le client et de signaler l'échec de communication.
try
{
...
double result = client.Add(value1, value2);
...
client.Close();
}
catch (TimeoutException exception)
{
Console.WriteLine("Got {0}", exception.GetType());
client.Abort();
}
catch (CommunicationException exception)
{
Console.WriteLine("Got {0}", exception.GetType());
client.Abort();
}
Si une exception attendue se produit, le client peut ou ne peut pas être utilisable après-coup. Pour déterminer si le client est encore utilisable, vérifiez que la propriété State est CommunicationState.Opened. Si le client est toujours ouvert, il est encore utilisable. Sinon, vous devez abandonner le client et libérer toutes les références à ce dernier.
Attention : |
---|
Vous pouvez observer que bien souvent les clients qui ont une session ne sont plus utilisables après une exception, et les clients qui n'ont pas de session sont encore utilisables après une exception. Toutefois, cela n'est pas garanti, donc si vous souhaitez essayer de continuer à utiliser le client après une exception, votre application doit vérifier la propriété State pour vérifier le client est encore ouvert. |
Lorsque vous exécutez l'exemple, les exceptions et réponses d'opération s'affichent dans la fenêtre de console du client.
Le processus client exécute deux scénarios, qui essaient tous deux d'appeler Add
puis Divide
. Le premier scénario simule un problème de réseau en abandonnant le client avant de faire appel à Divide
. Le deuxième scénario provoque une condition de délai d'attente en définissant un délai d'attente trop court pour que la méthode se termine. La sortie attendue du processus client est :
Add(100,15.99) = 115.99
Simulated network problem occurs...
Got System.ServiceModel.CommunicationObjectAbortedException
Add(100,15.99) = 115.99
Set timeout too short for method to complete...
Got System.TimeoutException
Pour configurer, générer et exécuter l'exemple
Assurez-vous d'avoir effectué la procédure figurant à la section Procédure d'installation unique pour les exemples Windows Communication Foundation.
Pour générer l'édition C# ou Visual Basic .NET de la solution, suivez les instructions indiquées dans Génération des exemples Windows Communication Foundation.
Pour exécuter l'exemple dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions figurant dans la rubrique Running the Windows Communication Foundation Samples.
Remarque : |
---|
Les exemples peuvent déjà être installés sur votre ordinateur. Recherchez le répertoire (par défaut) suivant avant de continuer.
<LecteurInstall>:\WF_WCF_Samples
Si ce répertoire n'existe pas, rendez-vous sur la page (éventuellement en anglais) des exemples Windows Communication Foundation (WCF) et Windows Workflow Foundation (WF) pour .NET Framework 4 pour télécharger tous les exemples Windows Communication Foundation (WCF) et WF. Cet exemple se trouve dans le répertoire suivant.
<LecteurInstall>:\WF_WCF_Samples\WCF\Basic\Client\ExpectedExceptions
|