5 de outubro de 2009

Usando um Web Service num projeto do Visual Studio

O envio das Notas Fiscais Eletrônicas para a Receita Federal é feito através de Web Services disponibilizados pela própria Receita. Quando falei neste blog a respeito da assinatura digital do XML, não tinha entrado neste assunto. Agora, me perguntaram como é que isso pode ser feito.

Os Web Services são uma solução de chamada remota de funções (mais ou menos como o CORBA ou o RPC) baseada no protocolo SOAP definido pelo Consórcio para padrões na Internet, o W3C. O SOAP foi amplamente adotado por ser baseado em XML, ou seja, a estrutura das mensagens trocadas poder ser estendida com facilidade.

Um Web Service é descrito por um arquivo de extensão WSDL (Web Service Description Language), que é na verdade um XML com uma estrutura bem conhecida. É o WSDL quem estabelece quais são as operações disponíveis no Web Service, isto é, quais são as funções (ou Serviços) que estão disponíveis, quais são os nomes e os tipos dos parâmetros que devem ser passados para a função. O WSDL permite até mesmo a criação de tipos de dados complexos, baseados em definições XSD.

Cada chamada a uma operação de um Web Service é feita construindo um XML que inclui a identificação do computador remoto (em forma de um endereço Web, também chamado de URL). Esse XML também inclui o próprio nome da função que será chamada no computador remoto e a lista dos parâmetros exigidos para chamar tal função, com seus nomes, seus respectivos tipos de dados e os valores com os quais desejamos que a chamada seja feita. Da mesma maneira, o retorno produzido pela chamada remota à função é também um XML, o qual contem as informações devolvidas pelo computador remoto ou uma mensagem de erro, no caso de a comunicação não ter sido possível.

A boa notícia é que o Visual Studio .NET (e outros IDEs, como o Delphi) consegue tratar todo esse trâmite para você.

Em qualquer linguagem da plataforma .NET, você pode adicionar ao seu projeto uma referência ao WebService, do mesmo jeito que você faz quando adiciona um ActiveX (COM). Na versão que eu tenho do Visual Studio (Team System 2008), esta opção está no menu Project e chama-se Add Service Reference mas em algumas versões pode estar como Add Web Reference. Ao selecionar esta opção, o Visual Studio vai abrir um diálogo para você informar a URL onde o web service está publicado. No caso da Nota Eletrônica, há um Web Service para cada tipo de operação - enviar a Nota, verificar o status da Nota Enviada, Cancelar uma Nota, contingência, etc.

Ao dar OK nesse diálogo, o Visual Studio lerá o WSDL contido na URL e gerará algumas classes para você poder fazer as chamadas remotas. A maioria das classes geradas é usada internamente apenas para tratar o protocolo de envio e recebimento do Web Service - aí incluindo as tags para o protocolo SOAP.

Do ponto de vista de quem está programando, basta criar uma instância da classe principal para a operação (por exemplo, NfeRecepcao) e fazer chamadas às funções internas dela. A impressão é que funções locais estão sendo chamadas mas, na realidade, a plataforma .NET cuidará de moldar o nome da função e os valores de seus parâmetros no formato XML correto, acionará o protocolo IP para a chamada remota e aguardará até que o computador remoto execute a função. O retorno produzido, que também é um XML, será desempacotado automaticamente e o valor da função calculada remotamente será devolvido pela função local de modo que o seu programa não sabe que a execução foi feita em outro computador.

6 comentários :

Flávio Nascimento disse...

CONTINUAÇÃO...
************** Loaded Assemblies **************
mscorlib
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.18444 built by: FX451RTMGDR
CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
WindowsFormsApplication1
Assembly Version: 1.0.0.0
Win32 Version: 1.0.0.0
CodeBase: file:///C:/ServicosPatrus/WindowsFormsApplication1.exe
----------------------------------------
System.Windows.Forms
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Runtime.Serialization
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.34234 built by: FX452RTMGDR
CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Serialization/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll
----------------------------------------
System.Data
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.ServiceModel
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.34234 built by: FX452RTMGDR
CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.ServiceModel/v4.0_4.0.0.0__b77a5c561934e089/System.ServiceModel.dll
----------------------------------------
System.Configuration
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.34234 built by: FX452RTMGDR
CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
SMDiagnostics
Assembly Version: 4.0.0.0
Win32 Version: 4.0.30319.34234 built by: FX452RTMGDR
CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/SMDiagnostics/v4.0_4.0.0.0__b77a5c561934e089/SMDiagnostics.dll
************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.
For example:



When JIT debugging is enabled, any unhandled exception will be sent to the JIT debugger registered on the computer rather than be handled by this dialog box.

Flávio Nascimento disse...

A chamada é feita assim:
List monitoramentoList = new GraberClient().ListaVeiculos("usuario","senha").ToList();

Luís Gustavo Fabbro disse...

Flávio

Seu código está gerando uma exceção mas o projeto no VS não foi configurado para depuração, de modo que não é possível saber a mensagem de erro reportada. Use a versão para depuração para descobrir o texto da exceção levantada.

[]s

Neibala disse...

Luís Gustavo

Estou tentando fazer o add service reference, só que estou recebendo o seguinte erro, o que poderia ser ?
url : https://nfe.fazenda.sp.gov.br/nfeweb/services/nfestatusservico2.asmx
erro :
There was an error downloading 'https://nfe.fazenda.sp.gov.br/nfeweb/services/nfestatusservico2.asmx'.
The request was aborted: Could not create SSL/TLS secure channel.
Metadata contains a reference that cannot be resolved: 'https://nfe.fazenda.sp.gov.br/nfeweb/services/nfestatusservico2.asmx'.
The HTTP request was forbidden with client authentication scheme 'Anonymous'.
The remote server returned an error: (403) Forbidden.
If the service is defined in the current solution, try building the solution and adding the service reference again.

Luís Gustavo Fabbro disse...

Neibala

A raiz do problema é a mensagem Could not create SSL/TLS secure channel. Ela indica que o certificado que você está usando para acessar o endereço remoto não pode ser validado. Isso pode significar que ele está vencido ou que ele não possui a chave privada ou que está faltando instalar a cadeia certificadora em seu computador. Nesse último caso, veja quem é o provedor do certificado e baixe a cadeia dele; veja tb se o problema não é com a cadeia do certificado do SEFAZ de São Paulo; baixe-a e instale-a em seu computador se os demais procedimentos não funcionarem.

[]s

Neibala disse...

Luís

Vou verificar estes procedimentos que você me indicou e qualquer novidade eu te aviso.

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.