WCF – Consumindo WebServices SOAP com o Magic xpa 4.x

Vejamos a seguir nesta publicação, como consumir um webServices SOAP no Magic xpa 4.x usando o MS.WCF

 

São várias as opções que temos disponíveis no Magic xpa 4.x para o consumo de webServices SOAP, a partir de um WSDL existente:

 

  • Invoke WS Lite
  • WCF Client
  • HTTP Post Operation
  • Apache AXIS2

 

Neste post, vamos abordar e exemplificar a opção 2: Consumo de WS SOAP com o MS.WCF.

(em outras publicações falaremos das demais opções)

 

Esta (WCF) é uma opção mono plataforma: serve somente para o SO Windows.

Mas antes, vamos abordar as “pré-condições” para utilização deste recurso.

 

Pré-Requisitos

MS.NET FrameWork 4.6.2 (ou >)

Vem por default na instalação/atualização do Windows. Mas se sua versão for inferior a esta por exemplo, pode ser necessário instá-lo (caso já não esteja) manualmente na máquina.

É um pré-requisito do Magic xpa Studio e também do Magic xpa Runtime.

DNet FW 4.8 = https://dotnet.microsoft.com/download/dotnet-framework/net48

O Script PowerShell (executado como ‘Admin‘ da máquina) abaixo permite consultar quais as atuais versões do DNet FW estão atualmente presentes:

 

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
Get-ItemProperty -name Version,Release -EA 0 |
Where { $_.PSChildName -match '^(?![SW])\p{L}'} |
Select PSChildName, Version, Release, @{
  name="Product"
  expression={
    switch -regex ($_.Release) {
      "378389" { [Version]"4.5" }
      "378675|378758" { [Version]"4.5.1" }
      "379893" { [Version]"4.5.2" }
      "393295|393297" { [Version]"4.6" }
      "394254|394271" { [Version]"4.6.1" }
      "394802|394806" { [Version]"4.6.2" }
      "460798|460805" { [Version]"4.7" }
      "461308|461310" { [Version]"4.7.1" }
      "461808|461814" { [Version]"4.7.2" }
      "528040|528449" { [Version]"4.8" }
      {$_.Release -gt 528449} { [Version]"Undocumented version (> 4.8), please update script" }
    }
  }
}

 

MS.NET FrameWork SDK Developer Pack 4.6.2 (ou >)

Este possivelmente precise ser instalado à parte, caso já não o tenha (para atender outros sistemas por exemplo).

DNet FW NDK 4.8 = https://dotnet.microsoft.com/download/visual-studio-sdks

É um pré-requisito do Magic xpa Studio somente.

Uma vez instalado, a sua pasta pode ser adicionada ao PATH do Windows:

 

SET PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools;<restante do PATH>

e a ferramenta “SvcUtil.EXE” precisa ser informada no MAGIC.INI, na seção [MAGIC_ENV], chave SvcUtilPath:

 

Consumindo o Serviço Web – Gerando a classe “Proxy”

Resolvidas as questões dos pré-requisitos, o próximo passo é ter a posse do WSDL do(s) serviço(s) que necessitamos acessar e codificar sua chamada no Magic xpa.

Neste exemplo vamos utilizar o https://www.dataaccess.com/webservicesserver/TextCasing.wso?WSDL, método InvertStringCase:

*Nota: Este WS simples recebe um texto como argumento e inverte suas letras maiúsculas em minúsculas, e vice-versa.

 

Devemos acessar o CRR do nosso projeto a adicionar uma novo componente do tipo “WCF Client“:

 

Em seguida, executamos o ZOOM (F5) neste novo componente e informamos ao assistente o WSDL do serviço (que pode ser uma URL ou um arquivo em disco).

Ao clicar “OK”, o Magic xpa Studio vai invocar o MS.WCF (<…>SvcUtil.exe [ … ] ), gerando um assembly DLL com o código .NET que faz o consumo deste webService.

Este módulo cliente de consumo é colocado na pasta %EngineDir%\WCFClientModules:

 

E passa a ser a referência interna no componente que acabamos de criar no CRR.

*Nota: Esta pasta %EngineDir%\WCFClientModules precisa ser levada para o ambiente do Magic xpa Runtime, que vai executar este projeto.

 

Consumindo o Serviço Web – Programando a chamada do Serviço

Tendo gerado a classe .NET de consumo, o passo final é a codificação no programa Magic xpa da chamada deste serviço.

Como é um componente  MS.WCF (.NET), isso é feito através de variáveis do tipo .NET nos programas.

Geralmente (mas não é regra imutável), uma chamada vai requerer 5 classes:

 

  • Stub = É a classe geral do serviço que foi decodificado e convertido em código .NET. Ela abrange todos os métodos listados no WSDL.
  • Request = É a classe que define o “corpo” (body) de envio do método que será invocado.
  • Request Body= É a classe que define o objeto com os “parâmetros de entrada” (caso existam) do método que será invocado.
  • Response = É a classe que define o objeto com o “retorno” (caso exista) do método que será invocado.
  • Response Body = É a classe que define o “corpo” (body) dentro do conteúdo do “retorno” (caso exista) do método que será invocado.

 

Para nosso método de exemplo (InvertStringCase), essas classes foram geradas como:

 

  • Client = mgWcfClient.TextCasing.TextCasingSoapTypeClient
  • Request = mgWcfClient.TextCasing.InvertStringCaseRequest
  • Request BODY = mgWcfClient.TextCasing.InvertStringCaseRequestBody
  • Response = mgWcfClient.TextCasing.InvertStringCaseResponse
  • Response BODY = mgWcfClient.TextCasing.InvertStringCaseResponseBody

 

Estes são justamente os tipos de dados das variáveis  .NET do nosso programa Magic xpa:

 

Tendo as variáveis definidas, em algum ponto do programa (ex: Task Prefix) é necessário instanciá-las (criar seus objetos), através da chamada dos seus construtores (exceto ‘Response’ e ‘ResponseBody’):

 

DotNet.mgWcfClient.TextCasing.TextCasingSoapTypeClient( 'TextCasingSoap' )
DotNet.mgWcfClient.TextCasing.InvertStringCaseRequestBody( RTrim( <Texto de Entrada> ) )
DotNet.mgWcfClient.TextCasing.InvertStringCaseRequest( <Objeto InvertStringCaseRequestBody Acima> )
*Nota: Este formato acima não é uma regra geral. Vai variar de serviço para serviço, método para método, a forma como devem ser preenchidos os argumentos de entrada.

 

Como este método (InvertStringCase) recebe um argumento (uma ‘string’), devemos preenchê-lo na classe RequestBody. E como um objeto acaba sendo parâmetro do construtor de outro, a ordem de instanciação é muito relevante.

*Nota: Diferente do JAVA, onde tudo é "método", no .NET existem "métodos" e "propriedades" nos objetos. Propriedades .NET podem ser atualizadas com a função DNSet().

 

Na sequência, é feita a chamada do método (com o objeto ‘Request‘ como argumento), e ele retorna uma instância (objeto) da classe ‘Response‘:

 

<Objeto CLIENT>.InvertStringCase( <Objeto REQST> )

 

E para finalizar, se deu tudo certo (não houver um .NET Exception), podemos extrair o resultado do objeto ‘ResponseBody‘, retornado dentro do objeto ‘Response‘:


<Objeto RESPONSEBODY>.InvertStringCaseResult

 

No exemplo, passamos como argumento a stringMAGIC SOFTWARE BRASIL‘ e o retorno do webService é este:

 

Baixe deste endereço um projeto exemplo com o Magic xpa 4.7, usando o MS.WCF .

 

Manoel Frederico Silva – Gerente de Tecnologia e Evangelista MAGIC – Magic Brasil
Manoel Frederico Silva – Evangelista MAGIC – Magic Brasil

 

Para receber os artigos do Blog Magic Brasil em primeira mão no seu email, registre-se aqui

Deixe um comentário

O seu endereço de e-mail não será publicado.