Tenho um webservice que está publicado com o JBOSS em dois servidores chamados desenv e homolog.
No servidor desenv, as requisições feitas através de dois programas cliente (um em Java e outro em C#) e do SoapUI funcionam perfeitamente.
Já no servidor homolog, ocorre um erro ao executar as requisições pela segunda vez em diante.
Após algumas verificações pude constatar que no servidor desenv o cabeçalho da resposta vem sempre como “text/xml” e o resultado é exibido corretamente. No servidor homolog e cabeçalho retorna “text/xml” na primeira execução e “text/plain” nas demais.
No SoapUI é possível desmarcar a opção “Accept compressed responses from hosts”, que faz com que as respostas das requisições ao servidor homolog passem a vir sempre corretamente.
Estou na dúvida sobre como fazer com que os clientes em java e c# passem a aceitar respostas com compressão assim como o SoapUI ou então fazer com que o servidor responda sempre com o Content-Type = “text/xml”.
Bom, a melhor solução, neste caso, seria você verificar porque os ambientes de dev e homologação estão diferentes (já que isso pode trazer outras divergências, que você e sua equipe podem nem ter notado, ainda). De qualquer maneira, tem um work around pra isso; faz o seguinte:
Anote a sua classe com a anotação @HandlerChain:
packagecom.alesaudate.webservices;@WebService@HandlerChain(file="handlers.xml")//Aqui, você referencia um arquivo de configuração. Neste caso, ele precisa estar no mesmo pacote que a classepublicclassMyService{//...}
Crie um arquivo de configuração, mais ou menos assim:
Depois de colocar isso, suas mensagens devem passar pelo método handleMessage para setar o content type, OK?
[]´s
G
gabriel_prn
Ainda não tentei aplicar o workaround do asaudate porque a coisa mudou um pouco de figura nesse momento.
Descobri que utilizando o cliente java eu preciso importar todos os jars do CXF (que foi usado na criação do webservice) para que a leitura da resposta seja feita corretamente.
Teoricamente o problema está somente no cliente em c#/.net, que não possui uma biblioteca CXF para fazer essa tradução da resposta. Utilizando o método tradicional de acessar webservices no .net persiste a mensagem de erro no content-type text/plain quando o esperado era text/xml.
Alguma idéia?
Acredito que simplesmente converter os .jar do CXF para .dll não funcionaria…
G
gabriel_prn
asaudate, como faço com que as mensagens passem pelo handleMessage da classe MimeTypeHandler?
Alexandre_Saudate
Colocando os arquivos que citei no seu projeto! Coloque o arquivo handlers.xml no mesmo diretório do seu webservice e veja o que acontece.
[]´s
G
gabriel_prn
Ah sim, fiz exatamente isso que você indicou. O método handleMessage foi acionado e o Content ficou como “text/xml”, mas mesmo assim, na chamada por um cliente continua vindo “text/plain”.
Na verdade é sempre na segunda requisição. A primeira vem como “text/xml” e os clientes conseguem ler. A segunda vem “text/plain”, ai só consigo fazer a consulta novamente se atualizar o wsdl.
Obrigado!
Alexandre_Saudate
gabriel_prn:
Ah sim, fiz exatamente isso que você indicou. O método handleMessage foi acionado e o Content ficou como “text/xml”, mas mesmo assim, na chamada por um cliente continua vindo “text/plain”.
Na verdade é sempre na segunda requisição. A primeira vem como “text/xml” e os clientes conseguem ler. A segunda vem “text/plain”, ai só consigo fazer a consulta novamente se atualizar o wsdl.
Obrigado!
Tente limpar os headers (no método handleMessage, mesmo) e tente de novo. Se mesmo assim você não conseguir, quer dizer que isso é resultado de alguma feature bem específica do seu ambiente e, nesse caso, só checando o ambiente pra saber o que acontece.