2010-08-17 21 views
8

Quiero personalizar excepciones/errores lanzados desde mi WCF Data Service, para que los clientes obtengan la mayor cantidad posible de información sobre qué fue exactamente lo que salió mal/qué es lo que falta. ¿Alguna idea de cómo se podría lograr esto?Manejo de excepciones con WCF Data Services

Respuesta

0

Debe crear excepciones personalizadas para esto. Lea este post aquí: Why Create Custom Exceptions?

¿En qué idioma está desarrollando?

Si necesita más información, por favor agregue algunos comentarios.

+0

estoy desarrollando en C#. Sin embargo, las excepciones que arrojo del servicio no llegan a los clientes que consumen el servicio. – Martinfy

0

No creo que quiera saber cómo lanzar/atrapar excepciones en .NET.

Probablemente desee obtener ideas sobre cómo decir a los clientes que consumen un Servicio de datos WCF que algo (y qué) salió mal cuando se lanza/atrapa una excepción en el lado del servidor (servicio).

WCF Data Services utiliza mensajes de solicitud/respuesta HTTP y no se puede simplemente lanzar una excepción desde el servicio al cliente.

3

se puede decorar su clase de servicio con este atributo ServiceBehaviorAttribute así:

[ServiceBehavior(IncludeExceptionDetailInFaults=true)] 
public class PricingDataService : DataService<ObjectContext>, IDisposable 
{ 
    ... 
} 
10

Hay algunas cosas que hay que hacer para garantizar excepciones burbuja sobre la tubería HTTP al cliente.

  1. Debe reconocer su clase DataService con lo siguiente:

    [ServiceBehavior (IncludeExceptionDetailInFaults = true)] MyDataService clase pública: DataService

  2. Debe habilitar errores detallados en la configuración:

    public static void InitializeService (DataServiceConfiguration config) { config.UseVerboseErro rs = verdadero; }

Es mejor que tirar dentro DataServiceException es. El tiempo de ejecución del servicio de datos WCF sabe cómo asignar las propiedades a la respuesta HTTP y siempre lo ajustará en un TargetInvocationException.

[WebGet] 
public Entity OperationName(string id) 
{ 
    try 
    { 
     //validate param 
     Guid entityId; 
     if (!Guid.TryParse(id, out entityId)) 
      throw new ArgumentException("Unable to parse to type Guid", "id"); 

     //operation code 
    } 
    catch (ArgumentException ex) 
    { 
     throw new DataServiceException(400, "Code", ex.Message, string.Empty, ex); 
    } 
} 

Luego, puede desempaquetar esto para el consumidor cliente reemplazando el HandleException en su DataService así:

/// <summary> 
/// Unpack exceptions to the consumer 
/// </summary> 
/// <param name="args"></param> 
protected override void HandleException(HandleExceptionArgs args) 
{ 
    if ((args.Exception is TargetInvocationException) && args.Exception.InnerException != null) 
    { 
     if (args.Exception.InnerException is DataServiceException) 
      args.Exception = args.Exception.InnerException as DataServiceException; 
     else 
      args.Exception = new DataServiceException(400, args.Exception.InnerException.Message); 
    } 
} 

Ver here para más información ...

Cuestiones relacionadas