Erro Soap - unknown compression method

3 respostas
J

Bom dia a todos,

Gostaria da ajuda de vocês, estou implementando o envio de notas fiscais eletrônica utilizando web services e tudo estava funcionando perfeitamente. Porém do nada começou a me retornar o seguinte erro: javax.servlet.ServletException: java.lang.RuntimeException: unknown compression method(-3). e não tenho idéa do que possa ser uma vez que nada foi alterado no servidor da aplicação. No meu código é gerada uma mensagem SOAP e o erro me parece ser relacionado ao metodo de compressão da mensagem SOAP, já pesquisei a respeito mas não obtive muito sucesso.
Alguém tem alguma idéia do que pode causar esse erro?

segue o erro:

javax.servlet.ServletException: java.lang.RuntimeException: unknown compression method(-3)

at Sdtbr_com_issnetonline_wwwwebservice_nfd_Homologacao_Servicos.recepcionarloterps(Sdtbr_com_issnetonline_wwwwebservice_nfd_Homologacao_Servicos.java:184)

at anfep005_impl.S1223(anfep005_impl.java:74)

at anfep005_impl.webExecute(anfep005_impl.java:38)

at com.genexus.webpanels.GXWebObjectBase.doExecute(Unknown Source)

at anfep005.doExecute(anfep005.java:19)

at com.genexus.webpanels.GXWebObjectStub.callExecute(Unknown Source)

at com.genexus.webpanels.GXWebObjectStub.doPost(Unknown Source)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:419)

at org.apache.catalina.servlets.InvokerServlet.doPost(InvokerServlet.java:169)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)

at br.com.locaweb.tomcat.LocaWebValve.invoke(LocaWebValve.java:101)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)

at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:199)

at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282)

at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:754)

at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:684)

at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:876)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)

at java.lang.Thread.run(Thread.java:595)

3 Respostas

C

Olá, uma idéia para começar a desvendar o problema seria verificar o request header e o response header.
Pois uma mensagem soap eh transmitida via http e há o método de compressão.

O que estou entendendo é que cliente não está falando bem com servidor, no que se refere à compressão gzip

Exemplo: O servidor não aceita compressão gzip e o cliente está enviando com compressão.

na comunicação, o lado 1 informa que ele pode trabalhar com gzip e o lado 2 responde informando que também pode.
Isso acontece qdo vc acessa uma página web. Onde o lado 1 eh o browser e o lado 2 o servidor web.

No seu caso, pode ser que um lado esteja forçando a compressão e o outro lado não aceite
Ou um lado esteja mandando sem compressão e o outro lado está esperando que venha com compressão.

J

CarvalR2, neste exemplo que vc deu, se eu entendi, a minha aplicação seria o cliente e o webservice o qual quero consumir seria o servidor. Tendo em vista que não foi alterado nada na minha aplicação e que a comunicação estava sendo realizada normalmente a alguns dias atrás, o problema poderia ser que foi alterada a forma de compressão esperada pelo webservice que recebe essa mensagem SOAP?

a classe que que gera a mensagem soap e realiza o envio ao webservice:

public String recepcionarloterps( String gxTp_xml )
   {
      String returnRecepcionarLoteRps ;
      initialize();
      returnRecepcionarLoteRps = "";
      context.globals.nSOAPErr = (short)(0) ;
      context.globals.sSOAPErrMsg = "" ;
      SoapParm.assignlocationproperties( context, "br_com_issnetonline_wwwwebservice_nfd_Homologacao_Servicos", GXSoapHTTPClient);
      GXSoapHTTPClient.addHeader("Content-type", "text/xml;charset=utf-8");
      GXSoapHTTPClient.addHeader("Connection", "close");
      GXSoapHTTPClient.addHeader("SOAPAction", "http://www.issnetonline.com.br/webservice/nfd/RecepcionarLoteRps");
      GXSoapXMLWriter.openRequest(GXSoapHTTPClient);
      GXSoapXMLWriter.writeStartDocument("utf-8", (byte)(0));
      GXSoapXMLWriter.writeStartElement("SOAP-ENV:Envelope");
      GXSoapXMLWriter.writeAttribute("xmlns:SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/");
      GXSoapXMLWriter.writeAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
      GXSoapXMLWriter.writeAttribute("xmlns:SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/");
      GXSoapXMLWriter.writeAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
      if ( ! ( soapHeaders == null ) )
      {
         if ( ( soapHeaders.size() > 0 ) )
         {
            soapHeaders.writexml(GXSoapXMLWriter, "SOAP-ENV:Header", "");
         }
      }
      GXSoapXMLWriter.writeStartElement("SOAP-ENV:Body");
      GXSoapXMLWriter.writeStartElement("RecepcionarLoteRps");
      GXSoapXMLWriter.writeAttribute("xmlns", "http://www.issnetonline.com.br/webservice/nfd");
      GXSoapXMLWriter.writeElement("xml", GXutil.rtrim( gxTp_xml));
      GXSoapXMLWriter.writeEndElement();
      GXSoapXMLWriter.writeEndElement();
      GXSoapXMLWriter.writeEndElement();
      GXSoapXMLWriter.close();
      GXSoapHTTPClient.execute("POST", "servicos.asmx");
      if ( ( GXSoapHTTPClient.getErrCode() == 0 ) )
      {
         GXSoapXMLReader.openResponse(GXSoapHTTPClient);
         GXSoapError = GXSoapXMLReader.read() ;
         while ( ( GXSoapError > 0 ) )
         {
            if ( ( GXutil.strSearch( GXSoapXMLReader.getName(), "Body", 1) > 0 ) )
            {
               if (true) break;
            }
            GXSoapError = GXSoapXMLReader.read() ;
         }
         if ( ( GXSoapError > 0 ) )
         {
            GXSoapError = GXSoapXMLReader.read() ;
            if ( ( GXSoapError > 0 ) && ( GXutil.strcmp(GXSoapXMLReader.getLocalName(), "Fault") == 0 ) )
            {
               soapFault = (short)(1) ;
            }
         }
         sTagName = GXSoapXMLReader.getName() ;
         if ( ( soapFault == 0 ) )
         {
            GXSoapError = GXSoapXMLReader.read() ;
            if ( ( GXSoapError > 0 ) && ( GXutil.strcmp(GXSoapXMLReader.getLocalName(), "Fault") == 0 ) )
            {
               soapFault = (short)(1) ;
            }
         }
         if ( ( soapFault == 1 ) )
         {
            GXSoapXMLReader.read();
            while ( ! ( ( GXutil.strcmp(GXSoapXMLReader.getLocalName(), "Fault") == 0 ) && ( GXSoapXMLReader.getNodeType() == 2 ) ) )
            {
               if ( ( GXutil.strcmp(GXutil.lower( GXSoapXMLReader.getName()), "faultcode") == 0 ) )
               {
                  sFaultCode = GXSoapXMLReader.getValue() ;
               }
               else if ( ( GXutil.strcmp(GXutil.lower( GXSoapXMLReader.getName()), "faultstring") == 0 ) )
               {
                  sFaultString = GXSoapXMLReader.getValue() ;
               }
               else if ( ( GXutil.strcmp(GXutil.lower( GXSoapXMLReader.getName()), "detail") == 0 ) )
               {
                  sDetail = GXSoapXMLReader.getValue() ;
               }
               GXSoapXMLReader.read();
            }
            if ( ( GXutil.strcmp(GXutil.lower( sFaultCode), "soap-env:client") == 0 ) )
            {
               currSoapErr = (short)(-20004) ;
               currSoapErrmsg = "Error in client request." + GXutil.newLine( ) + "Message: " + sFaultString + GXutil.newLine( ) + "Detail: " + sDetail ;
            }
            else if ( ( GXutil.strcmp(GXutil.lower( sFaultCode), "soap-env:server") == 0 ) )
            {
               currSoapErr = (short)(-20005) ;
               currSoapErrmsg = "Error in server execution." + GXutil.newLine( ) + "Message: " + sFaultString + GXutil.newLine( ) + "Detail: " + sDetail ;
            }
            else
            {
               currSoapErr = (short)(-20006) ;
               currSoapErrmsg = "Unknown error: " + sFaultCode + GXutil.newLine( ) + "Message: " + sFaultString + GXutil.newLine( ) + "Detail: " + sDetail ;
            }
         }
         else
         {
            nOutParmCount = (short)(0) ;
            while ( ( ( GXutil.strcmp(GXSoapXMLReader.getName(), sTagName) != 0 ) || ( GXSoapXMLReader.getNodeType() == 1 ) ) && ( GXSoapError > 0 ) )
            {
               readOk = (short)(0) ;
               if ( ( GXutil.strcmp(GXSoapXMLReader.getLocalName(), "RecepcionarLoteRpsResult") == 0 ) && ( ( GXutil.strcmp(GXSoapXMLReader.getNamespaceURI(), "http://www.issnetonline.com.br/webservice/nfd") == 0 ) || ( GXutil.strcmp(GXSoapXMLReader.getNamespaceURI(), "") == 0 ) ) )
               {
                  returnRecepcionarLoteRps = GXSoapXMLReader.getValue() ;
                  if ( ( GXSoapError > 0 ) )
                  {
                     readOk = (short)(1) ;
                  }
               }
               GXSoapError = GXSoapXMLReader.read() ;
               nOutParmCount = (short)(nOutParmCount+1) ;
               if ( ( readOk == 0 ) )
               {
                  context.globals.sSOAPErrMsg = context.globals.sSOAPErrMsg + "Error reading " + sTagName + GXutil.newLine( ) ;
                  GXSoapError = (short)(nOutParmCount*-1) ;
               }
            }
         }
         GXSoapXMLReader.close();
      }
      else
      {
         currSoapErr = (short)(GXSoapHTTPClient.getErrCode()*-1-10000) ;
         currSoapErrmsg = GXSoapHTTPClient.getErrDescription() + " (HTTP Error: " + GXutil.trim( GXutil.str( GXSoapHTTPClient.getStatusCode(), 10, 0)) + " " + GXSoapHTTPClient.getReasonLine() + ")" ;
      }
      if ( ( currSoapErr == 0 ) )
      {
         if ( ( GXSoapError < 0 ) )
         {
            currSoapErr = (short)(GXSoapError*-1) ;
            currSoapErrmsg = context.globals.sSOAPErrMsg ;
         }
         else
         {
            if ( ( GXSoapXMLReader.getErrCode() > 0 ) )
            {
               currSoapErr = (short)(GXSoapXMLReader.getErrCode()*-1) ;
               currSoapErrmsg = GXSoapXMLReader.getErrDescription() ;
            }
            else
            {
               if ( ( GXSoapError == 0 ) )
               {
                  currSoapErr = (short)(-20001) ;
                  currSoapErrmsg = "Malformed SOAP message." ;
               }
               else
               {
                  currSoapErr = (short)(0) ;
                  currSoapErrmsg = "No error." ;
               }
            }
         }
      }
      if ( ( currSoapErr != 0 ) )
      {
         oLocation = SoapParm.getlocation(context, "br_com_issnetonline_wwwwebservice_nfd_Homologacao_Servicos") ;
         if ( ( oLocation.getCancelOnError() == 0 ) || ( oLocation.getCancelOnError() == 1 ) )
         {
            throw new RuntimeException(currSoapErrmsg + "(" + currSoapErr+ ")");  // A Exceção é lançada aqui....
         }
      }
      context.globals.nSOAPErr = currSoapErr ;
      context.globals.sSOAPErrMsg = currSoapErrmsg ;
      return returnRecepcionarLoteRps ;
   }
C

Pelo fluxo do código, eu entendi que você consegue postar corretamente.
Entendi que ele entra no if
if ( ( GXSoapHTTPClient.getErrCode() == 0 ) )

Parece que o erro esta dando aqui (estou certo?):

GXSoapXMLReader.openResponse(GXSoapHTTPClient);   
     GXSoapError = GXSoapXMLReader.read() ;

pois la na exceção é pq a variavel GXSoapError é diferente de zero … ou seja, bem antes eh que ocorre o erro . .em algum lugar acima, onde ele seta a variavel GXSoapError

Ou seja, você ao ler a resposta do servidor, está tendo erro.

Isso aqui chega a funcionar? :
GXSoapXMLReader.openResponse(GXSoapHTTPClient);

Neste GXSoapXMLReader ou no GXSoapHTTPClient tem algum metodo que te permita listar as propriedades do Header do response?
Para vermos se tem o item ‘gzip’ ?

Criado 2 de junho de 2010
Ultima resposta 2 de jun. de 2010
Respostas 3
Participantes 2