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 ErrorHandling se muestra cómo ampliar el control sobre el control de errores y los informes de errores en un servicio de Windows Communication Foundation (WCF) mediante la IErrorHandler interfaz . El ejemplo se basa en la introducción con algún código adicional agregado al servicio para controlar los errores. El cliente fuerza varias condiciones de error. El servicio intercepta los errores y los registra en un archivo.
Nota:
El procedimiento de instalación y las instrucciones de compilación de este ejemplo se encuentran al final de este tema.
Los servicios pueden interceptar errores, realizar el procesamiento y afectar a cómo se notifican los errores mediante la IErrorHandler interfaz . La interfaz tiene dos métodos que se pueden implementar: ProvideFault(Exception, MessageVersion, Message) y HandleError. El ProvideFault(Exception, MessageVersion, Message) método permite agregar, modificar o suprimir un mensaje de error que se genera en respuesta a una excepción. El HandleError método permite que el procesamiento de errores tenga lugar en caso de error y controla si se puede ejecutar un control de errores adicional.
En este ejemplo, el CalculatorErrorHandler
tipo implementa la IErrorHandler interfaz . En el campo
HandleError método CalculatorErrorHandler
, escribe un registro del error en un archivo de texto Error.txt en c:\logs. Tenga en cuenta que el ejemplo registra el error y no lo suprime, lo que permite que se notifique de nuevo al cliente.
public class CalculatorErrorHandler : IErrorHandler
{
// Provide a fault. The Message fault parameter can be replaced, or set to
// null to suppress reporting a fault.
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
}
// HandleError. Log an error, then allow the error to be handled as usual.
// Return true if the error is considered as already handled
public bool HandleError(Exception error)
{
using (TextWriter tw = File.AppendText(@"c:\logs\error.txt"))
{
if (error != null)
{
tw.WriteLine("Exception: " + error.GetType().Name + " - " + error.Message);
}
tw.Close();
}
return true;
}
}
ErrorBehaviorAttribute
Existe como mecanismo para registrar un controlador de errores con un servicio. Este atributo toma un único parámetro de tipo. Ese tipo debe implementar la IErrorHandler interfaz y debe tener un constructor público y vacío. A continuación, el atributo crea una instancia de ese tipo de controlador de errores e lo instala en el servicio. Para ello, implementa la IServiceBehavior interfaz y, a continuación, usa el ApplyDispatchBehavior método para agregar instancias del controlador de errores al servicio.
// This attribute can be used to install a custom error handler for a service.
public class ErrorBehaviorAttribute : Attribute, IServiceBehavior
{
Type errorHandlerType;
public ErrorBehaviorAttribute(Type errorHandlerType)
{
this.errorHandlerType = errorHandlerType;
}
void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
{
}
void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
{
}
void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
{
IErrorHandler errorHandler;
try
{
errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
}
catch (MissingMethodException e)
{
throw new ArgumentException("The errorHandlerType specified in the ErrorBehaviorAttribute constructor must have a public empty constructor.", e);
}
catch (InvalidCastException e)
{
throw new ArgumentException("The errorHandlerType specified in the ErrorBehaviorAttribute constructor must implement System.ServiceModel.Dispatcher.IErrorHandler.", e);
}
foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
channelDispatcher.ErrorHandlers.Add(errorHandler);
}
}
}
El ejemplo implementa un servicio de calculadora. El cliente provoca deliberadamente dos errores en el servicio proporcionando parámetros con valores no válidos.
CalculatorErrorHandler
Usa la IErrorHandler interfaz para registrar los errores en un archivo local y, a continuación, permite que se notifiquen de nuevo al cliente. El cliente fuerza una división por cero y una condición de argumento fuera de intervalo.
try
{
Console.WriteLine("Forcing an error in Divide");
// Call the Divide service operation - trigger a divide by 0 error.
value1 = 22;
value2 = 0;
result = proxy.Divide(value1, value2);
Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
}
catch (FaultException e)
{
Console.WriteLine("FaultException: " + e.GetType().Name + " - " + e.Message);
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.GetType().Name + " - " + e.Message);
}
Al ejecutar el ejemplo, las solicitudes de operación y las respuestas se muestran en la ventana de la consola del cliente. Ve la división por cero y las condiciones del argumento fuera del intervalo que aparecen en el informe como errores. Presione ENTRAR en la ventana del cliente para apagar el cliente.
Add(15,3) = 18
Subtract(145,76) = 69
Multiply(9,81) = 729
Forcing an error in Divide
FaultException: FaultException - Invalid Argument: The second argument must not be zero.
Forcing an error in Factorial
FaultException: FaultException - Invalid Argument: The argument must be greater than zero.
Press <ENTER> to terminate client.
El archivo c:\logs\errors.txt contiene la información registrada sobre los errores por el servicio. Tenga en cuenta que para que el servicio escriba en el directorio, debe asegurarse de que el proceso en el que se ejecuta el servicio (normalmente ASP.NET o servicio de red) tiene permiso para escribir en el directorio.
Fault: Reason = Invalid Argument: The second argument must not be zero.
Fault: Reason = Invalid Argument: The argument must be greater than zero.
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 la solución, siga las instrucciones que se indican en Compilación de los ejemplos de Windows Communication Foundation.
Asegúrese de que ha creado el archivo c:\logs directory for the error.txt. O modifique el nombre de archivo usado en
CalculatorErrorHandler.HandleError
.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.