Pregunta

Estoy escribiendo un servicio WCF para la primera vez.El servicio y todos los de sus clientes (al menos por ahora) está escrito en C#.El servicio tiene que hacer un montón de validación de entrada en los datos que se le pasa, así que tengo que tener alguna manera de indicar los datos no válidos para el cliente.He estado leyendo mucho acerca de las fallas y excepciones, envasado excepciones de los fallos, y un montón de conflicto artículos que son sólo me confunde aún más.¿Cuál es la forma correcta de manejar este caso?

Debo evitar excepciones por completo y paquete de Resultados de un mensaje de vuelta?Debo crear un especial de la Culpa, o una Excepción especial, o simplemente tirar ArgumentExceptions como lo haría para un no-WCF función de validación?

El código que tengo ahora (influenciada por la 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 hay [FaultContract(typeof(ValidationFault))].Así es esta la manera "correcta" acerca de esto?

¿Fue útil?

Solución

Si usted 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), a continuación, me gustaría lanzar una excepción.Podría ser una excepción indicando que los parámetros no es válido con el nombre del parámetro.(ver:ArgumentException)

Pero puede que no quieras confiar en el cliente para validar correctamente los datos, y que te deja con la suposición de que los datos pueden ser inválidos entrada en el servicio web.En ese caso no es realmente un caso excepcional y no debe ser una excepción.En ese caso se podría volver una enumeración o un objeto de Resultado que tiene un Estado de la propiedad se establece en un enum (OK, no es Válido, Incompleta) y un Mensaje conjunto de propiedades con características específicas, como el nombre del parámetro.

Me gustaría asegurarse de que este tipo de errores se ha encontrado y corregido durante el desarrollo.Su proceso de control de calidad deben de prueba válidos y de los usos del cliente y no se quieren transmitir estos mensajes técnicos de vuelta al cliente.Lo que usted quiere hacer en su lugar es la actualización de su sistema de validación para evitar datos no válidos de llegar a la llamada de servicio.

Mi suposición para cualquier servicio de WCF es que habrá más de una interfaz de usuario.Uno podría ser una interfaz de usuario web de ahora, pero más tarde me pueden agregar otro con WinForms, WinCE o incluso un nativo de iPhone/Android aplicación móvil que no se ajusten a lo que usted espera de .NETO de los clientes.

Otros consejos

Lanzar una excepción no es útil de un servicio WCF ¿por Qué no?Porque se vuelve como un desnudo de culpa y necesita

a) Establecer la culpa a incluir excepciones

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

Así que sí que hay una falla más que una excepción.Yo, en su caso, crear un personalizado de culpa que contiene una lista de los campos que falló la validación como parte de la culpa de contrato.

Tenga en cuenta que WCF hace cosas divertidas con los diccionarios, que no son ISerializable;tiene un manejo especial, así que compruebe el mensaje que viene de atrás se ve bien a través del cable;si no es volver a las matrices para usted.

es posible que desee echar un vistazo a la MS Patrones y Prácticas de Empresa de la Biblioteca de la Validación de bloque en conjunto con la política de inyección de bloque enlace de texto te permite decorar tu contrato de datos de los miembros con los atributos de validación y también decorar la implementación del servicio, junto con su integración con WCF esto significa que los errores en la validación se devuelven como ArgumentValidationException fallas automáticamente cada uno contiene un ValidationDetail objeto para cada error de validación.

El uso de la entlib con WCf usted puede obtener una gran cantidad de validación, el informe de errores sin tener que escribir mucho código

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top