[NFe] NFeRecepcaoEvento A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint

Boa Tarde,

Comecei a desenvolver o serviço para efetuar o cancelamento da NFe e acabei me deparando com um problema na comunicação do cliente gerado com o serviço do Paraná. Recebendo a exceção abaixo:

javax.xml.ws.soap.SOAPFaultException: A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint.
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:155)
	at com.sun.proxy.$Proxy75.nfeRecepcaoEvento(Unknown Source)
	at br.com.devlogic.nfeapi.service.cancelamento.CancelamentoNfeServiceImpl.cancelar(CancelamentoNfeServiceImpl.java:113)
	at br.com.devlogic.apinfe.envio.TestCancelamentoNfeService.consultar(TestCancelamentoNfeService.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)

Tenho criado os clientes usando wsimport e todos tem funcionado normalmente (até agora).
Pelo que estive pesquisando sobre o motivo do erro, o web service parece atender somente requisições SOAP 1.1. Me corrigem se estiver errado.
Esse serviço do parana, parece ser um outra aplicação, diferente do que atende os outros serviços.

https://homologacao.nfe2.fazenda.pr.gov.br/nfe-evento/NFeRecepcaoEvento

Gostaria de saber o que tenho que fazer para atender esse serviço. Talvez gerar o cliente de outra forma, algo do tipo…

Tente gerar o cliente com o WSDL do PR mesmo, para ver se tem alguma diferença. Ou já fez isso?

Sim sim, todos os clientes tenho gerado com o wsdl do PR mesmo.

O que percebi, como comentei, esse serviço parece ser outra aplicação, diferente dos outros serviços.

E que esse serviço parece estar no padrao SOAP 1.1, pois o comando wsimport pode ser executado sem o parametro “-extension”, não gerando nenhum log de warning.
Ao contrario dos outros servicos, se rodado sem o parametro, gera o log:

Após um bom tempo, voltei a procura da solução desse problema. E comecei a ler a respeito sobre a definição no WSDL para atender SOAP 1.1 e 1.2.
Pela documentação, você define os binding conforme o protocolo. E configura as portas para atender ambas as versões.
No meu caso, o cliente web service foi gerado através do wsimport, q o padrão é SOAP 1.1, no comando nem era necessário adicionar o parâmetro -extension , dai saquei a causa, só pode ser problema no WSDL.

Verificando a definição de portas do WSDL, percebi que estava faltando a porta para SOAP 1.2. Conforme parte retirada:

<wsdl:service name='RecepcaoEvento'> <wsdl:documentation xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'>Servico destinado a recepcao de mensagens de evento de NF-e.</wsdl:documentation> <wsdl:port binding='tns:RecepcaoEventoSoap' name='RecepcaoEventoSoap'> <soap:address location='https://homologacao.nfe2.fazenda.pr.gov.br/nfe-evento/NFeRecepcaoEvento'/> </wsdl:port> </wsdl:service>
Para resolver, apenas adicionei a definicao da outra porta:

<wsdl:service name='RecepcaoEvento'> <wsdl:documentation xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'>Servico destinado a recepcao de mensagens de evento de NF-e.</wsdl:documentation> <wsdl:port binding='tns:RecepcaoEventoSoap' name='RecepcaoEventoSoap'> <soap:address location='https://homologacao.nfe2.fazenda.pr.gov.br/nfe-evento/NFeRecepcaoEvento'/> </wsdl:port> <wsdl:port binding='tns:RecepcaoEventoSoap12' name='RecepcaoEventoSoap12'> <soap12:address location='https://homologacao.nfe2.fazenda.pr.gov.br/nfe-evento/NFeRecepcaoEvento'/> </wsdl:port> </wsdl:service>

Solução simples, mas que foi um pouco dificil de encontrar devido a falta de teoria para o uso de wsdl com soap 1.1 e 1.2 =/

O principal problema aí não foi você não saber soap 1.1 vs. 1.2 - como cliente de um WS, você não deveria ter que mexer no WSDL… :frowning:

Exatamente, concordo contigo.

Mas no wsdl tem a definição para SOAP 1.2, veja os bindings

 <wsdl:binding name='RecepcaoEventoSoap' type='tns:RecepcaoEventoSoap'>
  <soap:binding transport='http://schemas.xmlsoap.org/soap/http'/>
  <wsdl:operation name='nfeRecepcaoEvento'>
   <soap:operation soapAction='http://www.portalfiscal.inf.br/nfe/wsdl/RecepcaoEvento/nfeRecepcaoEvento' style='document'/>
   <wsdl:input>
    <soap:body use='literal'/>
    <soap:header message='tns:nfeRecepcaoEventonfeCabecMsg' part='nfeCabecMsg' use='literal'></soap:header>
   </wsdl:input>
   <wsdl:output>
    <soap:body use='literal'/>
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>
 <wsdl:binding name='RecepcaoEventoSoap12' type='tns:RecepcaoEventoSoap'>
  <soap12:binding transport='http://schemas.xmlsoap.org/soap/http'/>
  <wsdl:operation name='nfeRecepcaoEvento'>
   <soap12:operation soapAction='http://www.portalfiscal.inf.br/nfe/wsdl/RecepcaoEvento/nfeRecepcaoEvento' style='document'/>
   <wsdl:input>
    <soap12:body use='literal'/>
    <soap12:header message='tns:nfeRecepcaoEventonfeCabecMsg' part='nfeCabecMsg' use='literal'></soap12:header>
   </wsdl:input>
   <wsdl:output>
    <soap12:body use='literal'/>
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>

Pela definição das portas estarem atendendo somente SOAP 1.1, então o problema pode ser no Web Service em si, certo ?

Sim, ou isso é um bug no WS, ou então mudaram a implementação e não atualizaram o WSDL.