WCF - Tratamento de exceções

Um desenvolvedor de serviço WCF pode encontrar alguns erros imprevistos que requerem relatórios ao cliente de maneira adequada. Esses erros, conhecidos comoexceptions, normalmente são manipulados usando blocos try / catch, mas, novamente, isso é muito específico da tecnologia.

Como a área de preocupação de um cliente não é sobre como ocorreu um erro ou os fatores que contribuíram para um erro, o contrato de falha SOAP é usado para comunicar a mensagem de erro do serviço para o cliente no WCF.

Um contrato de falha permite que o cliente tenha uma visão documentada dos erros ocorridos em um serviço. O exemplo a seguir oferece uma melhor compreensão.

Step 1 - Um serviço de calculadora fácil é criado com a operação de divisão que irá gerar exceções gerais.

using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Runtime.Serialization;
usingSystem.ServiceModel;
usingSystem.Text;

namespace Calculator {
   // NOTE: You can use the "Rename" command on the "Refactor" menu to change 
   // the interface name "IService1" in both code and config file together.
   
   [ServiceContract]
   
   public interface IService1 {
      [OperationContract]
      int divide(int num1, int num2);
      // TODO: Add your service operations here
   }
}

A codificação do arquivo de classe é mostrada abaixo -

Agora, quando tentamos dividir o número 10 por zero, o serviço de calculadora lançará uma exceção.

A exceção pode ser tratada pelo bloco try / catch.

Agora, quando tentamos dividir qualquer número inteiro por 0, ele retornará o valor 10 porque o tratamos no bloco catch.

Step 2 - FaultException é usado nesta etapa para comunicar as informações de exceção ao cliente do serviço.

public int Divide(int num1, int num2) { 
   //Do something 
   throw new FaultException("Error while dividing number"); 
}

Step 3- Também é possível criar um tipo personalizado para enviar a mensagem de erro usando FaultContract. As etapas essenciais para criar um tipo personalizado são mencionadas abaixo -

Um tipo é definido pelo uso de contrato de dados e os campos destinados a serem retornados são especificados.

A operação do serviço é decorada pelo atributo FaultContract. O nome do tipo também é especificado.

Uma instância de serviço é criada para levantar exceções e propriedades de exceção personalizadas são atribuídas.