Falhas WCF e exceções
-
01-07-2019 - |
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?
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