Pergunta
Estou confuso sobre como devo retornar erros a um cliente usando sabão.
Eu tenho um serviço WCF, mas não tenho certeza de qual tecnologia o cliente está usando, então eu gostaria de manter a especificação de sabão.
Até onde eu li, as mensagens de falha parecem ser a melhor maneira de lidar com isso.
Eu posso ver meu serviço com muitas falhas possíveis diferentes:
- NULL erros de dados esperados
- Erros de formato de dados (ou seja: db permite apenas 3 chars)
- Erros de intervalo de dados "o cliente já existe", "incapaz de processar sua solicitação" Erros do tipo
Seria apropriado criar um novo objeto para cada uma dessas falhas e jogar como tal:
FaultException<NullFault>(nf);
FaultException<InvalidDataFault>(idf);
FaultException<ArguementFault>(af);
FaultException<RangeFault>(rf);
O cliente está passando em grandes objetos com muitas propriedades para praticamente todos os métodos (ou seja: cliente, pedido etc.).
Essa seria a maneira correta de lidar com erros e enviar de volta para o cliente?
Parece fora do lugar ter que adicionar cada falha aos atributos acima do método.
Ou seja:
[OperationContract]
[FaultContract(typeof(NullFault))]
[FaultContract(typeof(InvalidDataFault))]
[FaultContract(typeof(ArguementFault))]
[FaultContract(typeof(RangeFault))]
void CreateCustomer(Customer customer);
Além disso, que tal um GenicFault? Como você lidaria com erros de regra de negócios? IE: O cliente já existe, muitos itens de linha, não enviam para essa área, método de pagamento não aceito etc.?
Informe -me se esse método é adequado ou se houver outra solução aceita e como você lidaria com a situação da 'regra de negócios'.
Solução
Retornar uma falha é a maneira correta de fazê -lo em geral, mas você também deve se perguntar o que o programa do cliente fará com as informações que você retornará em uma falha. Se o cliente precisar saber apenas que uma falha aconteceu, tudo o que você precisa é de uma única falha. Essa falha pode incluir o texto da mensagem que o cliente pode exibir para seu usuário.
Se o cliente precisar tomar uma ação diferente com base em ser um NullFault ou um RangeFault, é aí que você precisa de falhas separadas. Mas se não houver diferença entre um e outro, salve a si mesmo e o cliente programa algum tempo e esforço e definir apenas uma única falha.