André Alves de Lima

Talking about Software Development and more…

Acessando os web services dos Correios com C# e VB.NET (consulta de CEPs e preços)

Hoje em dia é impossível pensar em uma aplicação comercial que não tenha algum campo para a entrada de endereços em algum lugar do aplicativo. Dito isso, uma funcionalidade que podemos implementar muito facilmente e que facilitaria a vida do usuário é o preenchimento do endereço baseado no CEP. Antigamente isso só era possível através da compra de um banco de dados de CEPs. Atualmente, com os web services dos Correios nós podemos facilmente fazer essa consulta gratuitamente (pelo menos por enquanto). No artigo de hoje você vai conferir como acessar os web services dos Correios com C# e VB.NET para consultarmos CEPs e calcularmos preços de encomendas SEDEX ou PAC.

Quais são os web services disponibilizados pelos Correios?

No momento da escrita deste artigo (julho de 2016), os Correios disponibilizam quatro web services:

Sistema de Gerenciamento de Postagens dos Correios (SIGEP): esse primeiro web service possui métodos relacionados ao envio de encomendas, como geração de códigos para etiquetas, busca de clientes e consulta de CEPs. A maioria dos métodos necessita que você tenha um contrato com os Correios, porém, o método que vamos utilizar neste artigo (consulta de CEPs) não necessita de autenticação.

Logística reversa: sinceramente não entendi para que serve esse web service. O pessoal que entende de logística ou que trabalha com sistemas desse tipo deve entender. Se quiser deixar um comentário explicando esse conceito, fique à vontade.

Rastreamento de objetos: como o próprio nome já diz, ele possibilita o rastreio de objetos com base no código de 13 dígitos gerado pelos Correios. Não testei esse web service, mas, pelo que pude observar na documentação, ele precisa de um usuário e senha.

Calculador de preços e prazos de encomendas: faz o cálculo do preço e prazo de entrega para encomendas SEDEX e PAC. Se você não tiver um contrato com os Correios, ele também retornará os valores, mas, o preço será baseado na tabela geral (o mesmo preço gerado para qualquer pessoa através do site dos Correios).

Inacreditavelmente, existem documentos dos próprios Correios explicando a estrutura desses web services. Eles não são lá muito detalhados, mas, já é um bom começo. Os web services do SIGEP, logística reversa e rastreamento de objetos estão documentados aqui. Já o web service de cálculo de preços e encomendas está documentado aqui.

Consultando um CEP

Edit: em Setembro de 2017 eu publiquei um vídeo mostrando o processo de consulta de CEPs com os web services dos Correios. Caso você prefira a versão em vídeo, aqui vai ele:

O primeiro web service que vamos utilizar é o web service do SIGEP. Esse web service possui diversos métodos, mas, o que mais nos interessa para este artigo é o método que retorna o endereço correspondente a um CEP.

Para implementarmos essa consulta, vamos criar um novo projeto do tipo “Console Application“. Nós poderíamos criar qualquer tipo de projeto (como Windows Forms, WPF, Web Forms ou MVC), mas, para facilitar a nossa vida e focarmos diretamente nos web services, acredito que uma “Console Application” seja o tipo ideal de projeto.

Uma vez criado o projeto, vamos adicionar a referência para o primeiro web service dos Correios. Para isso, vá até o “Solution Explorer“, clique com o botão direito sobre “References” e escolha a opção “Add Service Reference“:

Na janela que se abre, temos que entrar com a URL da definição do web service que queremos acessar. No caso do web service do SIGEP, o endereço é o seguinte:

https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl

Digite esse endereço na caixa “Address“, clique em “Go“, escolha o serviço “AtendeCliente“, dê o nome de “WSCorreios” para a referência e clique em “OK”:

Pronto! Com isso já podemos acessar o web service para consultarmos o endereço relacionado a um CEP. O código é extremamente simples. Primeiramente temos que criar uma instância do “client” do web service e depois chamamos o método “consultaCEP” passando o CEP desejado. O resultado será retornado em uma variável do tipo “enderecoERP“, que possui todas as propriedades do endereço (como bairro, cidade, UF, etc):

            // C#
            System.Console.Write("Digite o CEP: ");
            var valor = System.Console.ReadLine();
            try
            {
                var ws = new WSCorreios.AtendeClienteClient();
                var resposta = ws.consultaCEP(valor);
                System.Console.WriteLine();
                System.Console.WriteLine("Endereço: {0}", resposta.end);
                System.Console.WriteLine("Complemento: {0}", resposta.complemento);
                System.Console.WriteLine("Complemento 2: {0}", resposta.complemento2);
                System.Console.WriteLine("Bairro: {0}", resposta.bairro);
                System.Console.WriteLine("Cidade: {0}", resposta.cidade);
                System.Console.WriteLine("Estado: {0}", resposta.uf);
                System.Console.WriteLine("Unidades de Postagem: {0}", resposta.unidadesPostagem);
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("Erro ao efetuar busca do CEP: {0}", ex.Message);
            }
            System.Console.ReadLine();
        ' VB.NET
        System.Console.Write("Digite o CEP: ")
        Dim Valor = System.Console.ReadLine()
        Try
            Dim WS = New WSCorreios.AtendeClienteClient()
            Dim Resposta = WS.consultaCEP(Valor)
            System.Console.WriteLine()
            System.Console.WriteLine("Endereço: {0}", Resposta.end)
            System.Console.WriteLine("Complemento: {0}", Resposta.complemento)
            System.Console.WriteLine("Complemento 2: {0}", Resposta.complemento2)
            System.Console.WriteLine("Bairro: {0}", Resposta.bairro)
            System.Console.WriteLine("Cidade: {0}", Resposta.cidade)
            System.Console.WriteLine("Estado: {0}", Resposta.uf)
            System.Console.WriteLine("Unidades de Postagem: {0}", Resposta.unidadesPostagem)
        Catch Ex As Exception
            System.Console.WriteLine("Erro ao efetuar busca do CEP: {0}", Ex.Message)
        End Try
        System.Console.ReadLine()

O CEP pode ser consultado tanto utilizando o hífen (exemplo 13484-339) ou sem hífen (13484339). Veja os resultados das consultas, inclusive contendo alguns cenários em que passamos CEPs inválidos para o serviço:

Calculando o preço e prazo de uma encomenda SEDEX ou PAC

Agora que já vimos a utilização do serviço do SIGEP para consulta de CEPs, vamos ver como podemos utilizar o outro web service dos Correios para fazermos o cálculo de uma encomenda SEDEX ou PAC.

Primeiramente, temos que adicionar outra referência de serviço no nosso projeto, dessa vez utilizando o nome “WSCorreiosPreco” e a seguinte URL:

http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx

Esse web service possui diversos métodos relacionados ao cálculo de preços e prazos de encomendas. O método que vamos utilizar é o “CalcPrecoPrazo“, que retorna tanto o preço quanto o prazo da encomenda. Esse método recebe várias informações, como o CEP de origem, CEP de destino, dimensões da encomenda, etc. Entre esses parâmetros, dois merecem uma maior atenção: tipo do envio e formato da encomenda.

O tipo de envio define qual serviço dos Correios que deverá ser utilizado para despachar a encomenda (SEDEX Varejo, SEDEX 10, PAC, etc). As opções para este parâmetro são as seguintes:

Já o formato da encomenda define se a encomenda será despachada em uma caixa, rolo ou envelope. As opções são as seguintes:

Por fim, os parâmetros referentes à entrega em mão própria e aviso de recebimento deverão ser passados no formato S/N (“S” caso o serviço deva ser considerado no cálculo e “N” caso o serviço não deva ser considerado).

Tendo em vista todas essas informações, o código para calcularmos o preço e prazo de uma encomenda ficaria assim:

            // C#
            System.Console.Write("Digite o código do tipo de envio: ");
            var tipoEnvio = System.Console.ReadLine();
            System.Console.Write("Digite o CEP de origem: ");
            var cepOrigem = System.Console.ReadLine();
            System.Console.Write("Digite o CEP de destino: ");
            var cepDestino = System.Console.ReadLine();
            System.Console.Write("Digite o peso (kg): ");
            var peso = System.Console.ReadLine();
            System.Console.Write("Digite o código do formato (caixa, envelope, etc): ");
            var codigoFormato = System.Console.ReadLine();
            System.Console.Write("Digite o comprimento: ");
            var comprimento = System.Console.ReadLine();
            System.Console.Write("Digite a altura: ");
            var altura = System.Console.ReadLine();
            System.Console.Write("Digite a largura: ");
            var largura = System.Console.ReadLine();
            System.Console.Write("Digite o diâmetro: ");
            var diametro = System.Console.ReadLine();
            System.Console.Write("Entrega em mão própria (S/N)?: ");
            var maoPropria = System.Console.ReadLine();
            System.Console.Write("Digite o valor declarado: ");
            var valorDeclarado = System.Console.ReadLine();
            System.Console.Write("Aviso de recebimento (S/N)?: ");
            var avisoRecebimento = System.Console.ReadLine();

            try
            {
                int codigoFormatoInt;
                if (!int.TryParse(codigoFormato, out codigoFormatoInt))
                    throw new Exception("Código do formato inválido");
                decimal comprimentoDecimal;
                if (!decimal.TryParse(comprimento, out comprimentoDecimal))
                    throw new Exception("Comprimento inválido");
                decimal alturaDecimal;
                if (!decimal.TryParse(altura, out alturaDecimal))
                    throw new Exception("Altura inválida");
                decimal larguraDecimal;
                if (!decimal.TryParse(largura, out larguraDecimal))
                    throw new Exception("Largura inválida");
                decimal diametroDecimal;
                if (!decimal.TryParse(diametro, out diametroDecimal))
                    throw new Exception("Diâmetro inválido");
                decimal valorDeclaradoDecimal;
                if (!decimal.TryParse(valorDeclarado, out valorDeclaradoDecimal))
                    throw new Exception("Valor declarado inválido");

                var ws = new WSCorreiosPreco.CalcPrecoPrazoWSSoapClient();
                var resposta = ws.CalcPrecoPrazo(string.Empty, string.Empty, tipoEnvio, cepOrigem, cepDestino, peso, codigoFormatoInt, comprimentoDecimal, alturaDecimal, larguraDecimal, diametroDecimal, maoPropria, valorDeclaradoDecimal, avisoRecebimento);
                var respostaReal = resposta.Servicos.FirstOrDefault();
                if (respostaReal != null)
                {
                    System.Console.WriteLine();
                    System.Console.WriteLine("Prazo: {0} dia", respostaReal.PrazoEntrega);
                    System.Console.WriteLine("Valor: R$ {0}", respostaReal.Valor);
                }
                else
                {
                    throw new Exception("Não foi possível encontrar os valores dentro da resposta do serviço");
                }
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("Erro ao efetuar cálculos: {0}", ex.Message);
            }
            System.Console.ReadLine();
        ' VB.NET
        System.Console.Write("Digite o código do tipo de envio: ")
        Dim TipoEnvio = System.Console.ReadLine()
        System.Console.Write("Digite o CEP de origem: ")
        Dim CepOrigem = System.Console.ReadLine()
        System.Console.Write("Digite o CEP de destino: ")
        Dim CepDestino = System.Console.ReadLine()
        System.Console.Write("Digite o peso (kg): ")
        Dim Peso = System.Console.ReadLine()
        System.Console.Write("Digite o código do formato (caixa, envelope, etc): ")
        Dim CodigoFormato = System.Console.ReadLine()
        System.Console.Write("Digite o comprimento: ")
        Dim Comprimento = System.Console.ReadLine()
        System.Console.Write("Digite a altura: ")
        Dim Altura = System.Console.ReadLine()
        System.Console.Write("Digite a largura: ")
        Dim Largura = System.Console.ReadLine()
        System.Console.Write("Digite o diâmetro: ")
        Dim Diametro = System.Console.ReadLine()
        System.Console.Write("Entrega em mão própria (S/N)?: ")
        Dim MaoPropria = System.Console.ReadLine()
        System.Console.Write("Digite o valor declarado: ")
        Dim ValorDeclarado = System.Console.ReadLine()
        System.Console.Write("Aviso de recebimento (S/N)?: ")
        Dim AvisoRecebimento = System.Console.ReadLine()

        Try
            Dim CodigoFormatoInt As Integer
            If (Not Integer.TryParse(CodigoFormato, CodigoFormatoInt)) Then
                Throw New Exception("Código do formato inválido")
            End If
            Dim ComprimentoDecimal As Decimal
            If (Not Decimal.TryParse(Comprimento, ComprimentoDecimal)) Then
                Throw New Exception("Comprimento inválido")
            End If
            Dim AlturaDecimal As Decimal
            If (Not Decimal.TryParse(Altura, AlturaDecimal)) Then
                Throw New Exception("Altura inválida")
            End If
            Dim LarguraDecimal As Decimal
            If (Not Decimal.TryParse(Largura, LarguraDecimal)) Then
                Throw New Exception("Largura inválida")
            End If
            Dim DiametroDecimal As Decimal
            If (Not Decimal.TryParse(Diametro, DiametroDecimal)) Then
                Throw New Exception("Diâmetro inválido")
            End If
            Dim ValorDeclaradoDecimal As Decimal
            If (Not Decimal.TryParse(ValorDeclarado, ValorDeclaradoDecimal)) Then
                Throw New Exception("Valor declarado inválido")
            End If

            Dim WS As New WSCorreiosPreco.CalcPrecoPrazoWSSoapClient()
            Dim Resposta = WS.CalcPrecoPrazo(String.Empty, String.Empty, TipoEnvio, CepOrigem, CepDestino, Peso, CodigoFormatoInt, ComprimentoDecimal, AlturaDecimal, LarguraDecimal, DiametroDecimal, MaoPropria, ValorDeclaradoDecimal, AvisoRecebimento)
            Dim RespostaReal = Resposta.Servicos.FirstOrDefault()
            If (RespostaReal IsNot Nothing) Then
                System.Console.WriteLine()
                System.Console.WriteLine("Prazo: {0} dia", RespostaReal.PrazoEntrega)
                System.Console.WriteLine("Valor: R$ {0}", RespostaReal.Valor)
            Else
                Throw New Exception("Não foi possível encontrar os valores dentro da resposta do serviço")
            End If
        Catch Ex As Exception
            System.Console.WriteLine("Erro ao efetuar cálculos: {0}", Ex.Message)
        End Try

        System.Console.ReadLine()

Entretanto, se tentarmos executar o projeto nesse momento, receberemos o seguinte erro:

Esse erro acontece porque o serviço de cálculo de preços dos Correios adiciona dois EndPoints no arquivo app.config: um utilizando SOAP e outro utilizando SOAP 1.2. Para consertar esse erro, temos que comentar um dos EndPoints no arquivo app.config. Eu, por exemplo, comentei o EndPoint referente ao SOAP 1.2:

Outra maneira de resolvermos esse problema sem alterarmos o app.config seria passarmos o nome do EndPoint a ser utilizado no construtor do serviço.

Após fazermos essa alteração e executarmos a aplicação, conseguiremos calcular os preços e prazos de entrega das encomendas:

Concluindo

Apesar de não encontrarmos muitos artigos detalhados sobre a utilização dos web services dos Correios com C# e VB.NET, você conferiu neste artigo que essa tarefa não é lá tão difícil de ser implementada. Basta sabermos os endereços dos web services, quais métodos utilizar e quais parâmetros passar.

Você já precisou utilizar os web services dos Correios na sua aplicação? Como é que ficou o seu código? Parecido com o código apresentado neste artigo ou você acabou fazendo de outra maneira? Conte-nos mais detalhes na caixa de comentários!

Por fim, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se utilizando o formulário logo abaixo.

Até a próxima!

André Lima

Newsletter do André Lima

* indicates required



Powered by MailChimp

55 thoughts on “Acessando os web services dos Correios com C# e VB.NET (consulta de CEPs e preços)

  • Cleidson disse:

    Excelente artigo. Até pouco tempo atrás, os correios não disponibilizavam esses webservices. Pelo menos não o de cep. Sobre a logística reversa, é um serviço no qual a empresa que vai receber a encomenda é que paga pelo envio. Ela gera uma autorização de postagem e envia esse número para o remetente e com esse número ele despacha a encomenda em qualquer agência sem pagar nada.

    • andrealveslima disse:

      Olá Cleidson!

      Muito obrigado pelo comentário! E valeu demais por esclarecer o esquema de logística reversa!

      Um grande abraço!
      André Lima

      • josé chaves disse:

        oi Andre lima estou teclando apartir de Angola tenho uma questão
        tenho um relatório no crystal reports alimentado por um dataset, com dados do tipo numerico (decimal) que apresenta cardinal(#) ao em vez do valor real o que devo fazer para resolver este cenário

        • andrealveslima disse:

          Olá José!

          Não entendi o seu problema.. Será que você poderia enviar uns screenshots para eu conseguir entender certinho?

          Abraço!
          André Lima

  • Diego disse:

    Muito bacana. Parabéns pelo post André.

  • Alessandra Soares disse:

    Como sempre, artigos sempre úteis para nós. Parabéns André!

    • andrealveslima disse:

      Olá Alessandra, muito obrigado pelo comentário! Fico feliz que você esteja gostando as publicações! Se algum dia você tiver alguma sugestão de tema para outros artigos, é só falar..

      Abraço!
      André Lima

  • Luis disse:

    Muito Bom o Conteúdo, porém você teria um exemplo para ser utilizado com formulário em vb.net?

    • andrealveslima disse:

      Olá Luis, obrigado pelo comentário!

      O código apresentado neste artigo pode ser utilizado com formulário sem problema algum.. Eu fiz com console application para ficar mais simples, mas, para trabalhar com formulário, você só precisa pegar as propriedades da variável “Resposta” e configurá-las como texto dos seus TextBox.. Por exemplo:

      TextBoxEndereco.Text = Resposta.end
      TextBoxComplemento.Text = Resposta.complemento
      

      E por aí vai.. Em qual parte exatamente você está com problemas para converter de console application para um visual com formulários?

      Abraço!
      André Lima

  • Frederico Simões disse:

    Olá André,
    Como sempre você anda quebrando barreiras. Excelente artigo publicado! Tenho aprendido muito com suas publicações. O nível de informação é excelente! Meus parabéns mais uma vez por estar compartilhando conhecimento.

    Usando este artigo, fiz uma aplicação windows forms e gostaria de saber se existe algum requisito na distribuição da aplicação. É só distribuir e pronto?

    Obrigado mais uma vez por sua ajuda de sempre.

    • andrealveslima disse:

      Olá Frederico!

      Muito obrigado pelo comentário e pelos elogios! Fico feliz que os artigos estejam te ajudando!

      Quanto à distribuição dessa aplicação, até onde eu saiba, esses webservices são abertos e sem restrições.. Ou seja, você pode utilizá-los nas suas aplicações e distribuí-las normalmente como qualquer outra aplicação.. Se o computador onde a aplicação for instalada tiver acesso à internet, a chamada ao webservice deve funcionar normalmente..

      Um grande abraço!
      André Lima

  • Gustavo disse:

    André boa tarde, parabéns pelo artigo, eu estou com uma aplicação parecida, rodando pelo visual studio 2010, roda normal, mas quando gera o executável e vai rodar no cliente o seguinte erro aparece
    “Could not find default endpoint element that references contract in the ServiceModel client configuration section. This might be because no configuration file was found for your application”
    Mas quando rodo pelo visual nenhum erro aparece, já passou por isso?
    Abraços

    • andrealveslima disse:

      Olá Gustavo, obrigado pelo comentário!

      Quando adicionamos um “service reference” no projeto, ele cria algumas entradas no arquivo app.config, para saber a URL do serviço, entre outras coisas.. Se você esquecer de copiar o arquivo .config no diretório da sua aplicação, o WCF não vai saber como acessar o serviço e vai dar esse erro que você mencionou.. Será que você não esqueceu de copiar o arquivo .config no computador do cliente?

      Abraço!
      André Lima

  • Rodrigo disse:

    Olá André Lima, parabéns pelo post, muito bom.
    Gostaria de saber se você chegou a implementar a Etiqueta de despacho de mercadoria dos correios.
    Fico no aguardo

    • andrealveslima disse:

      Olá Rodrigo, obrigado pelo comentário!

      Não cheguei a implementar a etiqueta de despacho de mercadoria.. Você sabe como é que funciona o esquema de impressão dela?

      Abraço!
      André Lima

  • Syd Franco disse:

    Muito bom artigo, André! E eu achando que teria algum problema para colocar uma consulta por CEP no sistema que estou desenvolvendo hehehe… Easy Easy!

    Obrigado pelo conteúdo, sempre muito relevante!

    • andrealveslima disse:

      Fala Syd, obrigado pelo comentário! Realmente essa consulta de CEP é bem tranquila.. Tem gente que não sabe que isso existe e tenta fazer a consulta direto no site para depois fazer o parse do HTML!! Loucura.. :)

      Enfim, valeu pelo elogio! Fico feliz que o artigo tenha te ajudado.. Qualquer coisa é só entrar em contato..

      Abraço!
      André Lima

  • Sames Davis disse:

    Como faço para fazer o mesmo com webservices de numero de processo judicial ?

    tenho um sistema de controle de processos, e gostaria de digitar o processo e ele buscar os dados , tem como ?

    • andrealveslima disse:

      Olá Sames!

      Pelo que pesquisei, o esquema de webservices na área judicial é bem mais complicado do que o caso dos Correios.. Nesse caso, pelo que entendi, não existe uma padronização e depende muito de cada Tribunal Estadual de Justiça.. Alguns estados disponibilizam um serviço comum (PJe) para acesso a processos de primeira instância (alguns estados segunda instância também). Veja mais informações neste link:

      Utilização do PJe

      Este outro link para uma discussão sobre esse tema também pareceu bastante interessante:

      Pesquisar dados de processos judiciais no site do TJSP

      Não sei em qual estado você atua, mas, aparentemente, fazer isso em âmbito nacional seria uma dor de cabeça gigantesca.. O ideal seria ligar no tribunal que você quer ter acesso aos dados e perguntar se eles têm algum web service para poder acessar os dados dos processos.. Se você conseguir o endereço de algum web service do tribunal que você quer trabalhar, me avisa que eu te ajudo a implementá-lo na sua aplicação..

      Abraço!
      André Lima

  • Thiago disse:

    André, achei o seu post sobre os correios, estou com um problema para implementação de outro serviço dos correios, a postagem reversa. Talvez você consiga me auxiliar.

    Eu faço a implementação do serviço normalmente, mas quando vou solicitar o uso do webservice sempre retorna esse erro:

    • A solicitação HTTP não está autorizada no esquema de autenticação de cliente ‘Anonymous’. O cabeçalho de autenticação recebido do servidor foi ‘Basic realm=”EJBWebServiceEndpointServlet Realm”‘.

    Obs.: O webservice exige um autenticação, que já estou fazendo.

    O endereço do webservice:
    https://cws.correios.com.br/logisticaReversaWS/logisticaReversaService/logisticaReversaWS?wsdl

    Já estou sem ideia do que fazer.
    E muito bom o seu post.

    • andrealveslima disse:

      Olá Thiago, obrigado pelo comentário!

      Poxa, não consigo fazer um teste aqui porque realmente precisa de credenciais, até mesmo para pegar o wsdl.. Você sabe se os Correios disponibilizam uma conta para testes? Caso contrário, se você quiser entrar em contato por e-mail me passando as credenciais, eu posso fazer um teste aqui para ver se funciona no meu projeto: contato [arroba] andrealveslima [ponto] com [ponto] br

      Abraço!
      André Lima

      • Thiago disse:

        Tem sim, um ambiente de homologação:

        https://apphom.correios.com.br/logisticaReversaWS/logisticaReversaService/logisticaReversaWS?wsdl

        Os dados para acesso:
        ID Correios – empresacws
        Senha – 123456
        Código Administrativo – 08082650
        Contrato – 9912208555
        Código do Serviço – 41076, 40380
        Cartão – 0057018901

        Irei te mandar por email o arquivo PDF com a documentação.

        Obrigado.

        • andrealveslima disse:

          Olá Thiago, obrigado pelas informações do ambiente de homologação! Pelo que testei aqui, para que o acesso funcione corretamente (pelo menos no ambiente de homologação) você precisa configurar o Endpoint como Https, tipo de credencial = Basic e passar as credenciais através da propriedade client.ClientCredentials.Username..

          Eu fiz um teste aqui e funcionou direitinho, veja só o código:

                      var binding = new System.ServiceModel.BasicHttpsBinding();
                      binding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Basic;
                      var address = new System.ServiceModel.EndpointAddress("https://apphom.correios.com.br/logisticaReversaWS/logisticaReversaService/logisticaReversaWS?wsdl");
                      using (var serv = new ServiceReference1.logisticaReversaWSClient(binding, address))
                      {
                          serv.ClientCredentials.UserName.UserName = "empresacws";
                          serv.ClientCredentials.UserName.Password = "123456";
                          serv.Open();
                          var result = serv.sobreWebService();
                          MessageBox.Show(result.resumo);
                      }
          

          Abraço!
          André Lima

          • Thiago disse:

            Boa tarde André,

            Utilizei o código acima pra testar mas estou tento o seguinte erro:

            O esquema de URI do provedor ‘https’ é inválido; esperado ‘http’.

          • andrealveslima disse:

            Olá Thiago!

            Qual é a URL do serviço “de verdade”? O de homologação começa com https, por isso que tive que criar um HttpsBinding.. Se o serviço de verdade utilizar http ao invés de https, você precisa criar um HttpBinding (e não HttpsBinding)..

            Você testou com a URL de homologação para ver se dá certo no seu projeto (ou seja, exatamente o código acima, CTRL C, CTRL V)?

            Abraço!
            André Lima

          • Thiago disse:

            Sim, foi um Ctrl C + Ctrl V.

            No documento que o correio fornece o ambiente de homologação esta:

            https://apphom.correios.com.br/logisticaReversaWS/logisticaReversaService/logisticaReversaWS?wsdl

            O de produção está:

            https://cws.correios.com.br/logisticaReversaWS/logisticaReversaService/logisticaReversa
            WS?wsdl

            Copiei direto do código.

            Se não tiver problema, posso te enviar o documento?

          • Thiago disse:

            André, fui refazer o código agora que percebi.

            Quando colei o :

            Dim binding = New System.ServiceModel.BasicHttpsBinding

            Apresentou erro, então alterei para:

            Dim binding = New System.ServiceModel.BasicHttpBinding

            Fui corrigir agora, mas o método com o HttpS, não aparece.

          • Thiago disse:

            Consegui resolver, utilizei o seguinte código:

            Dim binding = New System.ServiceModel.BasicHttpBinding
            binding.Security.Mode = BasicHttpSecurityMode.Transport
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic
            Dim address = New System.ServiceModel.EndpointAddress(“https://cws.correios.com.br/logisticaReversaWS/logisticaReversaService/logisticaReversaWS?wsdl”)

          • andrealveslima disse:

            Olá Thiago! Que bom que deu certo.. Aqui tinha funcionado daquela forma que postei.. Talvez com o endereço fora do ambiente de homologação as coisas sejam um pouco diferentes.. Obrigado por enviar o código final!

            Abraço!
            André Lima

          • Thiago disse:

            Muito obrigado pela ajuda André.

            Obs.: Eu acho que o motivo que não funcionou inicialmente, se deve ao framework que estou utilizando que era o 3.5.

          • andrealveslima disse:

            Olá Thiago!

            Bem observado.. Eu testei com o .NET 4.5.. Talvez no .NET 3.5 tenha alguma diferença mesmo..

            Abraço!
            André Lima

  • marcos saavedra disse:

    Perfeito!

    Usei aqui no visual studio com C# e funcionou certinho. Obrigado!

  • Denilson disse:

    Bom dia vc teria webService para consulta CNPJ na receita federal ?
    tenho um link mais não funciona no webForm C#
    http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/

    • andrealveslima disse:

      Olá Denilson!

      Aparentemente esse link não é correspondente a um web service.. Você conseguiu implementá-lo de alguma maneira (em qualquer plataforma que seja)? Aparentemente existem serviços (alguns pagos, outros parcialmente gratuitos) que implementam esse tipo de consulta, como este:

      ReceitaWS

      Abraço!
      André Lima

  • Leandro disse:

    Boa noite, André. Copiei exatamente o mesmo código do apresentado no post, mas ao testar aqui apareceu o seguinte erro:

    “Erro ao efetuar busca do CEP: Não havia um ponto de extremidade em escuta em https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente capaz de aceitar a mensagem. Em geral, isso é causado por um endereço ou ação de SOAP incorreta. Consulte InnerException, se presente, para obter mais detalhes.”

    (Visual Studio 2010, c#)

    • andrealveslima disse:

      Olá Leandro!

      Acabei de fazer um teste aqui com um projeto console, .NET 4.5 e funcionou perfeitamente (se quiser, baixe o projeto aqui).. Qual versão do .NET você está utilizando no seu projeto? Você não tem a possibilidade de testá-lo em uma versão mais recente do Visual Studio / .NET?

      Abraço!
      André Lima

      • Marko disse:

        Olá, tenho a mesma dificuldade…
        Baixei o seu projeto e, mesmo assim, segue o mesmo erro…
        Não consigo entender o que acontece, será que o servidor dos correios está fora?
        Será possível que meu proxy (Estou na empresa) esteja bloqueando o acesso ao servidor dos correios?
        Não acho possível, pois consigo acessar o link que a msg de erro mostra normalmente…
        Errormsg:
        ——————————
        Erro ao efetuar busca do CEP: Não havia um ponto de extremidade em escuta em https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente capaz de aceitar a mensagem. Em geral, isso é causado por um endereço ou ação de SOAP incorreta. Consulte InnerException, se presente, para obter mais detalhes.
        ——————————

        Conteúdo do link:
        ——————————
        HTTP GET not supported
        ——————————

        • andrealveslima disse:

          Olá Marko!

          Pode ser que o proxy da empresa esteja bloqueando o acesso sim.. Isso acontece com muita frequência.. Você já chegou a testar o mesmo projeto na sua casa? Eu acabei de testar aqui com o projeto de exemplo e funcionou perfeitamente a consulta do CEP..

          Abraço!
          André Lima

  • Madson Braz disse:

    Me tire uma duvida, posso utilizar esse mesmo raciocínio para o webservice de rastreio?

    http://webservice.correios.com.br/service/rastro/Rastro.wsdl

    • andrealveslima disse:

      Olá Madson!

      Teoricamente sim, você pode seguir a mesma ideia.. Eu não sabia que os Correios tinham também esse web service de rastreio, senão eu tinha incorporado ele no artigo.. Tenta aí e depois fala pra gente se você conseguiu utilizá-lo, OK?

      Abraço!
      André Lima

  • Jalber disse:

    Andre, com base no seu tutorial, fiz um modelo para consultar ceps com base em uma lista txt de ceps. O problema é que quando o sistema checa os ceps, se ele não encontrar um determinado cep, o webapi dos correios me retorna uma exception e eu não consigo ignorá-la… consequentemente, minha aplicacão para… Mesmo eu tratandose o retorno for null, ele cai em uma exception e a app para. O erro ocorre na linha “var ws = new WSCorreios.AtendeClienteClient();”. A Mensagem de erro é: System.ServiceModel.FaultException`1: ‘CEP NAO ENCONTRADO’.
    Como faço para resolver isso?

    while (true)
    {
    Linha = ArquivoEntrada.ReadLine();
    if (Linha != null)
    {
    string[] DadosLidos = Linha.Split(‘;’);
    var ws = new WSCorreios.AtendeClienteClient();
    var resposta = ws.consultaCEP(DadosLidos[0]);

    if (resposta.cep != null)
    {
    Console.WriteLine(“CEP: ” + resposta.cep + ” – End: ” + resposta.end + ” – Cidade: ” + resposta.cidade + ” – Bairro: ” + resposta.bairro + ” – Comlpl1: ” + resposta.complemento + ” – Compl2″ + resposta.complemento2 + ” – Uf: ” + resposta.uf);

    ArquivoSaida.WriteLine(resposta.cidade);

    }
    }
    ArquivoSaida.Flush();
    }

    • andrealveslima disse:

      Olá Jalber!

      Imagino que se você colocar todo o conteúdo do bloco “while” em um bloco “try-catch”, a sua aplicação não travará mais:

      while (true)
      {
         try
         {
            // seu código
         }
         catch (Exception ex)
         {
            // faça o log da exceção do jeito que você quiser
         }
      }
      

      Aproveitando a sua pergunta, o uso de blocos “while true” não é recomendado.. Isso vai fazer com que o processo fique com utilização de CPU alta o tempo todo, o que vai levar a performance do computador onde a aplicação estiver sendo executada para o espaço.. Ao invés disso, se o seu projeto for Console Application, utilize um Timer (disparando a cada segundo, por exemplo) com ManualResetEvent que faz com que a aplicação só pare de ser executada quando o usuário digitar CTRL + C.. O código ficaria mais ou menos assim:

      private static ManualResetEvent _quitEvent = new ManualResetEvent(false);
      
      static void Main(string[] args)
      {
      	Console.CancelKeyPress += (s, e) => {
      		_quitEvent.Set();
      	};
      
      	var timer = new Timer(Processar, null, 0, 1000);
      
      	_quitEvent.WaitOne();
      }
      
      private static void Processar(object p)
      {
      	// conteúdo do seu bloco while...
      }
      

      Abraço!
      André Lima

      • Jalber disse:

        Obrigado pela dica André!!

        Eu coloquei tudo dentro de Try…Catch e joguei a mensagem de erro para a tela…Era isso que estava faltando… Ao jogar a msg de erro para a tela, o sistema prossegue normalmente…

        Sobre melhorar a performance do While(true), eu gostei muito!!!! ótima dica!!!!

        Grande abraço!

  • Paulo Farah disse:

    Andre, boa tarde.
    Estou quebrando a cabeça aqui. fiz o web service num windows form. Num campo para digitar o cep no lost focus ele acessa o webservice e atualiza o endereço na minha máquina. mas quando disponibilizo para os usuários dá erro.
    Já coloquei o app.config na máquina do cliente e nada.

    “System.InvalidOperationException: Não foi possível localizar o elemento de ponto de extremidade com nome ‘AtendeClientePort’ e contrato ‘wsCorreios.AtendeCliente’ na seção de configuração do ServiceModel cliente. Isso pode ter ocorrido devido à falta de um arquivo de configuração para o seu aplicativo ou porque nenhum elemento de ponto de extremidade correspondendo a este nome pôde ser encontrado no elemento cliente.” Poderia me ajudar? obrigado!!!

    • andrealveslima disse:

      Olá Paulo!

      Estranho hein.. Esse erro acontece normalmente quando as informações não estão presentes no arquivo de configuração da aplicação.. Mas, como você mencionou, as informações estão presentes no app.config.. Como é que está o nome do seu arquivo de configuração? Você tem um arquivo chamado NomeDaSuaAplicação.exe.config no diretório da aplicação? Nesse arquivo as informações do web service estão corretas?

      Abraço!
      André Lima

  • Leonardo disse:

    Excelente! Parabéns pela iniciativa e pelo trabalho! Fico feliz por haver pessoas como você que nos ajudam tanto a crescer profissionalmente.
    Por favor nunca pare! rsrs
    abraço!

    • andrealveslima disse:

      Olá Leonardo, muito obrigado pelo comentário! Fico muito feliz por você ter gostado do conteúdo.. Pode ficar tranquilo que não vou parar não.. De vez em quando eu dou uma pausa (por exemplo, quando viajo de férias ou quando fico doente, como foi os dois casos das últimas semanas), mas assim que eu volto ou melhoro, eu continuo o processo.. :)

      Um forte abraço!
      André Lima

  • luiz disse:

    boa tarde, André. Agradeço por disponibilizar esse tutorial. Gostaria de saber se tem como pegar o webservice de pesquisa de objeto dos correios.

    • andrealveslima disse:

      Olá Luiz, obrigado pelo comentário!

      Quando eu escrevi o artigo, eu tinha encontrado um web service de rastreio de objetos, mas ele precisava de usuário e senha, portanto, não consegui testá-lo.. Aí, mais pra frente um outro leitor do site comentou sobre este web service de rastreio:

      http://webservice.correios.com.br/service/rastro/Rastro.wsdl

      Mas eu não cheguei a testar.. Teoricamente, basta seguir o mesmo processo (adicionar a service reference no projeto e chamar o método passando os atributos necessários).. Se você conseguir testar, volta aqui e conta pra gente se funcionou ou não..

      Abraço!
      André Lima

  • […] tempos atrás eu escrevi um artigo mostrando como acessar os web services dos Correios com C# e VB.NET. De lá para cá, eu tenho visto vários vídeos sendo publicados mostrando especificamente a parte […]

  • WILLIAN COSTA SILVERIO disse:

    André bom dia. Parabéns pelo post, talvez o único da internet com tanta objetividade e qualidade. Por gentileza, gostaria de saber se você já fez ou se tem alguma referência para passar a respeito do web service para gerar códigos para etiqueta?

    • andrealveslima disse:

      Olá Willian, obrigado pelo comentário!

      Como conversamos por e-mail, infelizmente eu não tenho experiência com a geração de etiquetas.. Vou ficar te devendo.. :(

      Abraço!
      André Lima

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *