Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'esempio ExpectedExceptions illustra come intercettare le eccezioni previste quando si usa un client tipizzato. Questo esempio si basa sull'Introduzione che implementa un servizio calcolatrice. In questo esempio il client è un'applicazione console (.exe) e il servizio è ospitato da Internet Information Services (IIS).
Annotazioni
La procedura di installazione e le istruzioni di compilazione per questo esempio si trovano alla fine di questo argomento.
Questo esempio illustra l'individuazione e la gestione dei due tipi di eccezione previsti che i programmi corretti devono gestire: TimeoutException e CommunicationException.
Le eccezioni generate dai metodi di comunicazione in un client Windows Communication Foundation (WCF) sono previste o impreviste. Le eccezioni impreviste includono errori irreversibili, ad OutOfMemoryException esempio e errori di programmazione come ArgumentNullException o InvalidOperationException. In genere non esiste un modo utile per gestire gli errori imprevisti, pertanto in genere non è consigliabile intercettarli quando si chiama un metodo di comunicazione client WCF.
Le eccezioni previste dai metodi di comunicazione in un client WCF includono TimeoutException, CommunicationExceptione qualsiasi classe derivata di CommunicationException. Questi indicano un problema durante la comunicazione che può essere gestito in modo sicuro interrompendo il client WCF e segnalando un errore di comunicazione. Poiché i fattori esterni possono causare questi errori in qualsiasi applicazione, le applicazioni corrette devono intercettare queste eccezioni e recuperare quando si verificano.
Esistono diverse classi derivate di CommunicationException che un client può generare. In alcuni casi, anche le applicazioni intercettano alcune di queste per eseguire una gestione speciale, ma lasciano che le altre siano gestite come un CommunicationException. A tale scopo, è possibile intercettare prima il tipo di eccezione più specifico e quindi intercettare CommunicationException in una clausola catch successiva.
Il codice che chiama un metodo di comunicazione client deve intercettare le TimeoutException e le CommunicationException. Un modo per gestire tali errori consiste nell'interrompere il client e segnalare l'errore di comunicazione.
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();
}
Se si verifica un'eccezione prevista, è possibile che il client sia utilizzabile o meno successivamente. Per determinare se il client è ancora utilizzabile, verificare che la State proprietà sia CommunicationState.Aperta. Se è ancora aperto, è ancora utilizzabile. In caso contrario, è necessario interrompere il client e rilasciare tutti i riferimenti.
Attenzione
È possibile osservare che i client che dispongono di una sessione spesso non sono più utilizzabili dopo un'eccezione e i client che non dispongono di una sessione sono spesso utilizzabili dopo un'eccezione. Tuttavia, nessuno di questi è garantito, quindi se si vuole provare a continuare a usare il client dopo un'eccezione, l'applicazione deve controllare la State proprietà per verificare che il client sia ancora aperto.
Quando si esegue l'esempio, le risposte e le eccezioni dell'operazione vengono visualizzate nella finestra della console client.
Il processo client esegue due scenari, ognuno dei quali tenta di chiamare Add seguito da Divide. Il primo scenario simula un problema di rete interrompendo il client prima di effettuare la chiamata a Divide. Il secondo scenario causa una condizione di timeout impostando il tempo di attesa troppo breve per consentire il completamento del metodo. L'output previsto dal processo client è:
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
Per configurare, compilare ed eseguire l'esempio
Assicurati di aver eseguito la procedura di installazione di One-Time per gli esempi di Windows Communication Foundation.
Per compilare l'edizione C# o Visual Basic .NET della soluzione, seguire le istruzioni in Compilazione degli esempi di Windows Communication Foundation.
Per eseguire l'esempio in una configurazione con computer singolo o incrociato, seguire le istruzioni riportate in Esecuzione degli esempi di Windows Communication Foundation.