Pergunta

Eu estou escrevendo um serviço WCF pela primeira vez. O serviço e todos os seus clientes (pelo menos por agora) são escritos em C #. O serviço tem que fazer um monte de validação de entrada nos dados que é passado, então eu preciso ter alguma forma de indicar volta dados inválidos para o cliente. Estive lendo muito sobre as falhas e exceções, exceções envolvimento em falhas, e um monte de conflito artigos que estão apenas me confundindo ainda mais. O que é a maneira correta de lidar com este caso?

Devo evitar exceções completamente e empacotar uma mensagem de resultados de retorno? Devo criar uma Falha especial, ou uma exceção especial, ou apenas jogar ArgumentExceptions como eu faria para uma função de validação não-WCF?

O código que eu tenho agora (influenciado por MSDN ) é :

[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;
    }
}

E no método há [FaultContract (typeof (ValidationFault))]. Portanto, este é o caminho "certo" para abordar isso?

Foi útil?

Solução

Se você está fazendo a validação no cliente e devem ter valores válidos uma vez que eles são passados ??para o método (a chamada de serviço web), então eu iria lançar uma exceção. Poderia ser uma exceção indicando que um parâmetro é inválido com o nome do parâmetro. (Ver: ArgumentException)

Mas você não pode querer contar com o cliente corretamente validar os dados e que te deixa com a suposição de que os dados podem ser inválida entrando no serviço web. Nesse caso, não é realmente um caso excepcional e não deve ser uma exceção. Nesse caso, você poderia retornar um enum ou um objeto resultado que tem um conjunto de propriedades de estado para um ENUM (OK, inválido, incompleto) e um conjunto de propriedades da mensagem com detalhes, como o nome do parâmetro.

Gostaria de assegurar que esses tipos de erros são encontrados e corrigidos durante o desenvolvimento. Seu processo de QA deve testar cuidadosamente usos válidos e inválidos do cliente e você não quer para retransmitir essas mensagens técnicas de volta ao cliente. O que você quer fazer em vez disso é atualizar seu sistema de validação para evitar que dados inválidos de chegar ao serviço de chamada.

A minha suposição para qualquer serviço WCF é que haverá mais de uma UI. Um deles poderia ser uma interface web agora, mas mais tarde I pode adicionar outro usando WinForms, WinCE ou mesmo um nativo do iPhone / Android aplicação móvel que não estejam em conformidade com o que você espera de clientes NET.

Outras dicas

lançar uma exceção não é útil a partir de um serviço WCF Por que não? Porque se trata de volta como uma falha nua e você precisa

a) Definir a falha para incluir exceções

b) Analisar a falha para obter o texto da exceção e ver o que aconteceu.

Então, sim, você precisa de um defeito e não uma excepção. Gostaria, no seu caso, criar um erro personalizado que contém uma lista dos campos que falharam a validação como parte do contrato de culpa.

Note que WCF faz coisas divertidas com dicionários, que não são ISerializable; ele tem tratamento especial, de modo a verificar a mensagem voltar parece bom sobre o fio; se não é voltar para matrizes para você.

Você pode querer dar uma olhada nas Patterns MS e Práticas bloco Enterprise Library Validation em conjunto com o bloco de injeção política de texto do link ele permite que você decorar seus membros contrato de dados com atributos de validação e também decorar a implementação do serviço, este juntamente com a sua integração com o WCF isto significa que falhas na validação são devolvidos como falhas ArgumentValidationException automaticamente cada um contendo um objeto ValidationDetail para cada falha de validação.

Usando o EntLib com o WCF você pode obter um monte de validação, o relatório de erros sem ter que escrever muito código

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top