static void DemonstraCommunicationException()
        {
            // Cria o cliente
            ClienteCalculadora cliente = new ClienteCalculadora();

            try
            {
                // Chama a operação Somar do serviço.
                double valor1    = 100.00D;
                double valor2    = 15.99D;
                double resultado = cliente.Somar(valor1, valor2);
                Console.WriteLine("Somar({0},{1}) = {2}\r\n", valor1, valor2, resultado);

                // Simula um problema de rede ao abortar a conexão.
                Console.WriteLine("Ocorreu um problema de conexão de rede simulado...\r\n");
                cliente.Abort();

                // Chama a operação Dividir. Agora que o canal foi encerrado abruptamente,
                // a próxima chamada irá falhar.
                valor1    = 22.00D;
                valor2    = 7.00D;
                resultado = cliente.Dividir(valor1, valor2);
                Console.WriteLine("Dividir({0},{1}) = {2}\r\n", valor1, valor2, resultado);

                // NÃO DEVE CHEGAR NESTA LINHA, pois o método Dividir irá lançar uma exceção

                // Se chegar aqui, devemos fechar o cliente "graciosamente",
                // para que o canal feche sem problemas e limpe/finalize os recursos.
                cliente.Close();

                Console.WriteLine("O serviço retornou todos os resultados com sucesso.\r\n");
            }
            catch (TimeoutException exception)
            {
                Console.WriteLine("Exceção capturada: {0}\r\n", exception.GetType());
                cliente.Abort();
            }
            catch (CommunicationException exception)
            {
                // O controle da execução é direcionado para cá quando o método cliente.Dividir lança
                // uma exceção. A exceção real é CommunicationObjectAbortedException, que é uma subclasse
                // de CommunicationException.
                Console.WriteLine("Exceção capturada: {0}\r\n", exception.GetType());
                cliente.Abort();
            }
        }
        static void DemonstraTimeoutException()
        {
            // Cria um cliente
            ClienteCalculadora cliente = new ClienteCalculadora();

            try
            {
                // Chama a operação Somar do serviço.
                double valor1    = 100.00D;
                double valor2    = 15.99D;
                double resultado = cliente.Somar(valor1, valor2);
                Console.WriteLine("Somar({0},{1}) = {2}\r\n", valor1, valor2, resultado);

                // Define um timeout muito pequeno. Isso irá fazer com que a próxima chamada
                // falhe com uma TimeoutException, porque ela não pode processar dentro do tempo devido.
                Console.WriteLine("Define o timeout muito curto, e assim o método não pode ser completado...\r\n");
                cliente.InnerChannel.OperationTimeout = TimeSpan.FromMilliseconds(0.001);

                // Chama a operação Dividir do serviço.
                valor1    = 22.00D;
                valor2    = 7.00D;
                resultado = cliente.Dividir(valor1, valor2);
                Console.WriteLine("Dividir({0},{1}) = {2}\r\n", valor1, valor2, resultado);

                // NÃO DEVE CHEGAR NESTA LINHA, pois o método Dividir irá lançar uma exceção

                // Se chegar aqui, devemos fechar o cliente "graciosamente",
                // para que o canal feche sem problemas e limpe/finalize os recursos.
                cliente.Close();

                Console.WriteLine("O serviço retornou todos os resultados com sucesso.\r\n");
            }
            catch (TimeoutException exception)
            {
                // O controle da execução é direcionado para cá quando o método cliente.Dividir lança
                // uma exceção TimeoutException.
                Console.WriteLine("Exceção capturada: {0}\r\n", exception.GetType());
                cliente.Abort();
            }
            catch (CommunicationException exception)
            {
                Console.WriteLine("Exceção capturada: {0}\r\n", exception.GetType());
                cliente.Abort();
            }
        }
        static void DemonstraCaminhoFeliz()
        {
            // Cria o cliente
            ClienteCalculadora cliente = new ClienteCalculadora();

            // Chama a operação Somar do serviço.
            double valor1    = 100.00D;
            double valor2    = 15.99D;
            double resultado = cliente.Somar(valor1, valor2);

            Console.WriteLine("Somar({0},{1}) = {2}\r\n", valor1, valor2, resultado);

            // Chama a operação Dividir do serviço.
            valor1    = 22.00D;
            valor2    = 7.00D;
            resultado = cliente.Dividir(valor1, valor2);
            Console.WriteLine("Dividir({0},{1}) = {2}\r\n", valor1, valor2, resultado);

            // Fechamos o cliente "graciosamente",
            // para que o canal feche sem problemas e limpe/finalize os recursos.
            cliente.Close();

            Console.WriteLine("O serviço retornou todos os resultados com sucesso.\r\n");
        }