2008-09-18 18 views
6

Estoy escribiendo un servicio WCF por primera vez. El servicio y todos sus clientes (al menos por ahora) están escritos en C#. El servicio tiene que hacer una gran cantidad de validación de entrada en los datos que se pasan, así que tengo que tener alguna forma de indicar datos inválidos al cliente. He estado leyendo mucho sobre fallas y excepciones, envolviendo excepciones en fallas y muchos artículos conflictivos que me confunden más. ¿Cuál es la forma correcta de manejar este caso?Fallos y excepciones WCF

¿Debo evitar las excepciones por completo y empaquetar un mensaje de devolución de resultados? ¿Debo crear una falla especial o una excepción especial, o simplemente lanzar ArgumentExceptions como lo haría para una función de validación que no sea WCF?

El código que ahora he (influenciado por MSDN) es:

[DataContract] 
public class ValidationFault 
{ 
    [DataMember] 
    public Dictionary<string, string> Errors { get; private set; } 

    [DataMember] 
    public bool Fatal { get; private set; } 

    [DataMember] 
    public Guid SeriesIdentifier { get; private set; } 

    public ValidationFault(Guid id, string argument, string error, bool fatal) 
    { 
     SeriesIdentifier = id; 
     Errors = new Dictionary<string, string> {{argument, error}}; 
     Fatal = fatal; 
    } 

    public void AddError(string argument, string error, bool fatal) 
    { 
     Errors.Add(argument, error); 
     Fatal |= fatal; 
    } 
} 

Y en el método que hay [FaultContract (typeof (ValidationFault))]. Entonces, ¿es esta la forma "correcta" de abordar esto?

Respuesta

3

Si está haciendo la validación en el cliente y debe tener valores válidos una vez que se pasan al método (la llamada al servicio web), entonces lanzaría una excepción. Podría ser una excepción que indica que un parámetro no es válido con el nombre del parámetro. (Consulte: ArgumentException)

Pero es posible que no desee confiar en que el cliente valide correctamente los datos y eso lo deja con la suposición de que los datos podrían ser inválidos al ingresar al servicio web. En ese caso, no es realmente un caso excepcional y no debe ser una excepción. En ese caso, podría devolver un enum o un objeto Result que tenga una propiedad de Estado configurada en una enumeración (OK, Invalid, Incomplete) y una propiedad de Mensaje configurada con detalles, como el nombre del parámetro.

Me aseguraré de que este tipo de errores se encuentran y se solucionan durante el desarrollo. Su proceso de control de calidad debe probar cuidadosamente los usos válidos e inválidos del cliente y no desea retransmitir estos mensajes técnicos al cliente. Lo que quiere hacer en su lugar es actualizar su sistema de validación para evitar que los datos no válidos lleguen a la llamada de servicio.

Mi suposición para cualquier servicio de WCF es que habrá más de una UI. Ahora podría ser una interfaz de usuario web, pero luego puedo agregar otra usando WinForms, WinCE o incluso una aplicación móvil nativa de iPhone/Android que no se ajuste a lo que espera de los clientes .NET.

2

es posible que desee ver el bloque Validación de biblioteca empresarial de patrones y prácticas de MS junto con el bloque de inyección de política link text que le permite decorar sus miembros de contrato de datos con atributos de validación y decorar la implementación del servicio. con su integración con WCF, esto significa que las fallas en la validación se devuelven como fallas de ArgumentValidationException que contienen un objeto ValidationDetail para cada falla de validación.

Utilizando el EntLib con WCF se puede obtener una gran cantidad de validación, el informe de errores sin tener que escribir mucho código

+0

Para cualquier persona interesada, aquí está el [enlace] (http://msdn.microsoft.com/en-us/library/ff953182 (v = pandp.50) .aspx) para la guía de inicio del Bloque de validación EntLib . – Crackerjack

4

lanzar una excepción no es útil a partir de un servicio WCF Por qué no? Debido a que se trata de volver como un fallo al descubierto y hay que

a) Establecer el fallo de incluir excepciones

b) Analizar la falla para obtener el texto de la excepción y ver qué pasaba.

Así que sí, necesita una falla en lugar de una excepción.En su caso, crearía un error personalizado que contiene una lista de los campos que no pasaron la validación como parte del contrato de falla.

Tenga en cuenta que WCF hace cosas divertidas con diccionarios que no son ISerializables; tiene un manejo especial, por lo tanto, verifique que el mensaje que regresa se vea bien a través del cable; si no, regresa a las matrices por ti.

Cuestiones relacionadas