none
Consumindo webservice com WSSE em uma orchestration

    Pergunta

  • Olá pessoal,

    Estou com um problema aqui que não estou conseguindo resolver. Eu tenho um webservice que usa WSSE (do CorporeRM da Totvs). Eu estou tentando criar uma aplicação onde exponho a orchestration como webservice. Ela recebe um request (xml) com assinatura igual ao do CorporeRM. Faço o query do CorporeRM e devolvo o resultado para a porta de origem. Parece bem simples.

    Este é um exemplo do que estou tentando fazer. Esta é uma prova de conceito. Basicamente, eu pego o request na Receive_1 vindo da porta da esquerda com tipo de mensagem MsgInbound e repasso pelo Send_2 para a porta da direita (CorporeRM). recebo no Receive_2 a resposta com MsgOutbound e repasso para a porta da esquerda com o Send_1 com MsgOutbound.

    É apenas um passthrough neste POC.

    Se eu faço o testo direto no WS da direita (CorporeRM) com o xml de request que estou usando, funciona OK. Se eu tento pela orchestration acima, é como se as credenciais fossem perdidas, recebo erro de autenticação:

    Tentei no ConstructMessage_1 injetar estas credenciais sem muito sucesso. Tentei ali criando uma MsgRequest (mesmo schema) mas só tenho 2 propriedades, apesar de todas estarem promovidas. Aparecem os parâmetros do BODY mas não do HEADER.

    MsgRequest.Params = MsgInbound.Params;
    MsgRequest.Schema = MsgInbound.Schema;

    Acho que eu estou cometendo algum erro simples, então peço ajuda dos colegas para me orientarem como usar esta autenticação WSSE.

    Exemplo do XML usado abaixo, com o usuário e senha ocultos. No BizTalk naturalmente. Os dados do PARAMS também removi por sigilo.

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
       <soapenv:Header>
          <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
             <wsse:UsernameToken >
                <wsse:Username>XXXXXXX</wsse:Username>
                <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">XXXXXXXXXXXXX</wsse:Password>
             </wsse:UsernameToken>
          </wsse:Security>
       </soapenv:Header>
       <soapenv:Body>
          <tem:ConsultaProduto>
             <tem:CodColigada>01</tem:CodColigada>
             <tem:Params><![CDATA[<PARAMS> 
    (...)
    </PARAMS>]]></tem:Params>
             <tem:Schema>false</tem:Schema>
          </tem:ConsultaProduto>
       </soapenv:Body>
    </soapenv:Envelope>
    

    Agradeço por qualquer ajuda.

    quarta-feira, 4 de novembro de 2015 18:41

Respostas

  • Bom dia alemos.

    Primeiro, temos que ter em mente que a execução da chamada do Web Service dentro da orchestration é igual a chamada usada pelo Soap-ui por exemplo.

    Só precisamos de uma configuração adicional.

    Se vc fizer essa chamada pelo Soap-ui funciona, certo?

    No administration Console, qual o adaptador que vc usa para fazer essa chamada do web service?

    Talvez voce tenha que usar esse WCF-WSHttp. Segue um link que pode ajudar.

    https://msdn.microsoft.com/en-us/library/bb245939.aspx

    Esses threads aqui tb podem ajudar:

    https://social.msdn.microsoft.com/Forums/en-US/42bdc076-6c7c-40bb-9ccd-1ea6934971fd/how-to-define-custom-soap-headers-in-biztalk-orchestration?forum=biztalkgeneral

    http://stackoverflow.com/questions/20156144/add-a-soap-header-to-biztalk-soap-adapter


    Espero ter ajudado
    Ruth Resende
    MVP, MCTS - Biztalk Server
    www.biztalkbrasil.com.br
    Twitter: @ruthresende

    quinta-feira, 5 de novembro de 2015 13:15
    Moderador
  • Olá Ruth,

    Depois de muito mexer e pesquisar, achei dois pontos que tive que alterar. Nos send e receive ports, tive que alterar o Port Type que estava para o schema específico para MultiPart. Depois, tive que constuir a mensagem adicionando as credenciais na orchestration.

    Com isso, começou a funcionar. Compartilhando aqui para caso alguém tenha este problema. A orchestration recebe a request, monta a nova mensagem acrescentando o SOAP WSSE Header e consulta o outro webservice. Na volta, usei um map para mapear para o schema de saída e retonar ao solicitando os dados. Ficou muito bom, com tratamentos de erro, etc.

    Um artigo que ajudou muito (não lembro quem me indicou) foi este:

    How to Configure a WCF-WSHttp Send Port
    https://msdn.microsoft.com/en-us/library/bb245939.aspx?f=255&MSPPError=-2147217396

    Seguindo sua dica de mudar de SOAP para WSHTTP, apesar de ter acabado usando BASIC HTTP.

    Muito obrigado pela ajuda! WSSE é algo novo para mim :)

    Abraço,

    Aécio


    quarta-feira, 11 de novembro de 2015 16:59

Todas as Respostas

  • Bom dia alemos.

    Primeiro, temos que ter em mente que a execução da chamada do Web Service dentro da orchestration é igual a chamada usada pelo Soap-ui por exemplo.

    Só precisamos de uma configuração adicional.

    Se vc fizer essa chamada pelo Soap-ui funciona, certo?

    No administration Console, qual o adaptador que vc usa para fazer essa chamada do web service?

    Talvez voce tenha que usar esse WCF-WSHttp. Segue um link que pode ajudar.

    https://msdn.microsoft.com/en-us/library/bb245939.aspx

    Esses threads aqui tb podem ajudar:

    https://social.msdn.microsoft.com/Forums/en-US/42bdc076-6c7c-40bb-9ccd-1ea6934971fd/how-to-define-custom-soap-headers-in-biztalk-orchestration?forum=biztalkgeneral

    http://stackoverflow.com/questions/20156144/add-a-soap-header-to-biztalk-soap-adapter


    Espero ter ajudado
    Ruth Resende
    MVP, MCTS - Biztalk Server
    www.biztalkbrasil.com.br
    Twitter: @ruthresende

    quinta-feira, 5 de novembro de 2015 13:15
    Moderador
  • Olá Ruth,

    Muito obrigado pela resposta. Acho que ajudou sim, mas não deu certo ainda, mas deu um problema antes de chegar a mandar para o WebService. No ConstructMessage_1 tá dando o erro "Object not set to an instance of an object." Neste shape, ele monta a request. Eu li um pouco na internet e sugeriram que poderia ser um namespace do meu XSD que não existe. No schema, ele referencia http://schemas.microsoft.com/BizTalk/2003 que parece não existir mais. Sabe me dizer se mudou para outro endereço? Acho que posso por o tempuri.org ali mas não vai ter as referências que o schema precisa.

    Atenciosamente,

    Aécio

    sexta-feira, 6 de novembro de 2015 14:20
  • Esse erro depende muito de como vc gerou o schema para executar a chamada do Web Service.

    O ideal é gerar os schemas automaticamente, pelo wizard do biztalk.

    Sempre que possivel, usar o map, para construir as mensagens.

    Nos meus projetos, se for uma mensagem simples, (por exemplo procedure de banco com poucos parametros), eu uso o shape de contruct com xmlDocument, e gero um exemplo da mensagem gerada automatica pelo biztalk. Pra gerar o exemplo de mensagem , clico com botao direito no schema e em Generate Instance, vai gerar um xml de exemplo.

    Aqui tem um exemplo de como gerar instancias de XML: http://www.biztalkbrasil.com.br/2014/09/criando-e-testando-schemas-biztalk.html Sessão Gerando uma Intancia XML do Schema

    Mas em uma situação especifica, eu já passei por esse erro. E documentei o episodio aqui:

    http://www.biztalkbrasil.com.br/2012/02/erro-consumindo-servicos-wcf-object.html


    Espero ter ajudado
    Ruth Resende
    MVP, MCTS - Biztalk Server
    www.biztalkbrasil.com.br
    Twitter: @ruthresende

    sexta-feira, 6 de novembro de 2015 18:25
    Moderador
  • Olá Ruth,

    Muito obrigado pelas dicas! Vou criar novamente esta orchestration desta vez usando um map. Eu gerei os schemas à partir do WSDL usando o wizard, mas vou gerar tudo novamente e ver se não cometi algum erro no meio do caminho.

    Eu te aviso se der certo ou se eu encontrar mais algum problema!

    Vou agora ler o seu post sobre o erro!

    Aécio

    sexta-feira, 6 de novembro de 2015 23:24
  • Olá Ruth,

    Depois de muito mexer e pesquisar, achei dois pontos que tive que alterar. Nos send e receive ports, tive que alterar o Port Type que estava para o schema específico para MultiPart. Depois, tive que constuir a mensagem adicionando as credenciais na orchestration.

    Com isso, começou a funcionar. Compartilhando aqui para caso alguém tenha este problema. A orchestration recebe a request, monta a nova mensagem acrescentando o SOAP WSSE Header e consulta o outro webservice. Na volta, usei um map para mapear para o schema de saída e retonar ao solicitando os dados. Ficou muito bom, com tratamentos de erro, etc.

    Um artigo que ajudou muito (não lembro quem me indicou) foi este:

    How to Configure a WCF-WSHttp Send Port
    https://msdn.microsoft.com/en-us/library/bb245939.aspx?f=255&MSPPError=-2147217396

    Seguindo sua dica de mudar de SOAP para WSHTTP, apesar de ter acabado usando BASIC HTTP.

    Muito obrigado pela ajuda! WSSE é algo novo para mim :)

    Abraço,

    Aécio


    quarta-feira, 11 de novembro de 2015 16:59