Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En el ejemplo ExpectedExceptions se muestra cómo detectar excepciones esperadas al usar un cliente tipado. Este ejemplo se basa en la Guía de inicio que implementa un servicio de calculadora. En este ejemplo, el cliente es una aplicación de consola (.exe) y los Servicios de Internet Information Server (IIS) hospedan el servicio.
Nota:
El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.
En este ejemplo se muestra cómo detectar y controlar los dos tipos de excepciones esperados que deben controlar los programas correctos: TimeoutException
y CommunicationException
.
Las excepciones que se producen a partir de los métodos de comunicación en un cliente de Windows Communication Foundation (WCF) pueden ser esperadas o inesperadas. Las excepciones inesperadas incluyen errores catastróficos, como OutOfMemoryException
errores de programación como ArgumentNullException
o InvalidOperationException
. Normalmente no hay ninguna manera útil de controlar errores inesperados, por lo que normalmente no debe detectarlos al llamar a un método de comunicación de cliente WCF.
Las excepciones esperadas de los métodos de comunicación en un cliente WCF incluyen TimeoutException
, CommunicationException
y cualquier clase derivada de CommunicationException
. Estos indican un problema durante la comunicación que se puede controlar de forma segura anulando el cliente WCF e informando de un error de comunicación. Dado que los factores externos pueden provocar estos errores en cualquier aplicación, las aplicaciones correctas deben detectar estas excepciones y recuperarse cuando se producen.
Hay varias clases derivadas de CommunicationException
que un cliente puede lanzar. En algunos casos, las aplicaciones detectan también algunas de ellas para que se gestionen de forma especial, pero deja que otras las gestionen como CommunicationException
. Esto se puede lograr detectando primero el tipo de excepción más específico y, a continuación, detectando CommunicationException
en una cláusula catch posterior.
El código que llama a un método de comunicación de cliente debe detectar TimeoutException
y CommunicationException
. Una manera de controlar estos errores es anular el cliente e informar del error de comunicación.
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 se produce una excepción esperada, el cliente puede o no ser utilizable después. Para determinar si el cliente sigue usable, compruebe que la State
propiedad es CommunicationState
. Abierto. Si todavía está abierto, todavía se puede usar. De lo contrario debería anular el cliente y liberar todas las referencias a él.
Precaución
Es posible observar que los clientes con sesión a menudo dejan de ser utilizables tras una excepción, mientras que los clientes sin sesión a menudo aún son utilizables. Sin embargo, ninguna de estas opciones está garantizada, por lo que si desea intentar seguir usando el cliente después de una excepción, la aplicación debe comprobar la State
propiedad para comprobar que el cliente todavía está abierto.
Al ejecutar el ejemplo, las respuestas y excepciones de la operación se muestran en la ventana de la consola del cliente.
El proceso de cliente ejecuta dos escenarios, cada uno de los cuales intenta llamar Add
seguido de Divide
. El primer escenario simula un problema de red anulando el cliente antes de realizar la llamada a Divide
. El segundo escenario provoca una situación de tiempo de espera al establecer un período de espera excesivamente corto para que el método pueda completarse. El resultado esperado del proceso de cliente es:
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
Para configurar, compilar y ejecutar el ejemplo
Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.
Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.
Para ejecutar el ejemplo en una configuración de una máquina única o entre máquinas, siga las instrucciones de Ejecución de los ejemplos de Windows Communication Foundation.