2011-04-13 26 views
6

Estoy usando un cliente generado por JAX-WS (usando wsimport, el que viene con Glassfish 2.1.1) para conectarme a un servicio web generado ASP.NET que se ejecuta en un IIS 6.
Cuando solicito compresión en la respuesta (mediante la inclusión de encabezado HTTP Accept-Encoding: gziptravés de JAX-WS SOAP de Manipuladores de) los IIS 6 respuestas con una respuesta comprimida, pero no incluye la Content-Encoding: gzip encabezado de respuesta HTTP, por lo que obtener la siguiente excepción:Java: ¿Hay alguna manera de cambiar los encabezados de respuesta HTTP recibidos?

com.sun.xml.ws.protocol.soap.MessageCreationException: Couldn't create SOAP message due to exception: XML reader error: com.sun.xml.stream.XMLStreamException2: ParseError at [row,col]:[1,1] 
Message: Content is not allowed in prolog. 
at com.sun.xml.ws.encoding.SOAPBindingCodec.decode(SOAPBindingCodec.java:361) at com.sun.xml.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:173) 
at com.sun.xml.xwss.XWSSClientPipe.process(XWSSClientPipe.java:160) 
at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:115) 
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:595) 
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:554) 
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:539) 
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:436) 
at com.sun.xml.ws.client.Stub.process(Stub.java:248) 
at com.sun.xml.ws.client.sei.SEIStub.doProcess(SEIStub.java:135) 
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:109) 
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89) 
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:118) 

Editado Abr 17 de, 2011

También he intentado, utilizando el mismo SOAPHandler utilizo para solicitar respuesta comprimido, para modificar las encabezados de respuesta, sino la excepción se produce antes de que el gestor se llama.

Edición del 17 de Abr, 2011

Además, cuando hago la misma petición al servicio Web a través soapUI 3.6.1 con la preferencia "Aceptar respuestas comprimidos de los ejércitos", que se puede ver lo que he dicho: el servidor IIS 6 no está incluyendo el encabezado de respuesta HTTP para la compresión y soapUI muestra la respuesta como 'datos binarios' y muestra estas cabeceras de respuesta:

HTTP/1.1 200 OK 
Date: Wed, 13 Apr 2011 08:50:55 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Cache-Control: private, max-age=0 
Content-Type: text/xml; charset=utf-8 
Content-Length: 1104 

Si -con soapUI- no lo hago solicitar respuesta comprimida obtengo la siguiente respuesta Tamaño:

Content-Length: 2665 

Por lo tanto, la pregunta aquí es, como he dicho, que IIS6 no es la adición de la cabecera Contended-Encoding en la respuesta. Mi pregunta es: ¿es posible agregar -programadamente- el encabezado Content-Encoding? O bien, también podría ser: ¿es posible solicitarle a IIS6 que incluya el encabezado Content-Encoding?

ACTUALIZACIÓN
con Charles web proxy de depuración 3.5.2 He confirmado la respuesta de IIS6 no incluye el Content-Encoding cabecera:

HTTP/1.1 200 OK 
Date Wed, 13 Apr 2011 10:51:53 GMT 
Server Microsoft-IIS/6.0 
X-Powered-By ASP.NET 
X-AspNet-Version 2.0.50727 
Cache-Control private, max-age=0 
Content-Type text/xml; charset=utf-8 
Content-Length 1110 

supongo que esto puede ser un problema más relacionado con el servicio web que con IIS 6

+1

Ha buscado informes de errores? Esto parece ser un error grave en IIS, ya que viola claramente las especificaciones de HTTP 1.1. No creo que sea posible hackear el encabezado desde el lado del cliente ya que todo el procesamiento HTTP se realiza una vez que el control llega a su código. – musiKk

+1

Hola @musiKk, he visto [aquí] (http://forums.iis.net/t/1160183.aspx) en el último comentario: "He comentado que en el encabezado de respuesta faltan dos entidades: Variar Aceptar codificación y codificación de contenido gzip " –

+0

¿Puede usar Apache CXF como su proveedor JAX-WS? Puede ser posible con CXF pero si estás atrapado con el RI no me molestaré en investigar. – mtpettyp

Respuesta

0

La solución específica de JAX-WS es intentar colocar un controlador en la cadena de entrada del cliente. El controlador accederá al contexto del servlet, obtendrá el objeto de solicitud, observará la carga útil y, si comienza con la secuencia específica de GZ, agregará el encabezado HTTP a la lista de los existentes.

Desventajas: puede que no funcione. Espero que la lista de encabezados HTTP sea una colección inmutable. Además, el análisis sintáctico del contenido (y la falla) puede ocurrir antes de que el primer manejador obtenga el control.

(tuve otra sugerencia aquí - para usar un filtro HTTP - pero luego me di cuenta de que JAX-WS es un cliente, y no usa web.xml).

+0

Hola, he intentado agregar el "Content-Encoding" a los encabezados de respuesta en un ** SOAPHandler ** (lo mismo que uso para solicitar una respuesta comprimida), pero parece que la excepción se produce incluso antes de que el controlador se llama. Gracias por tu contribución. –

0

has necesitado añadir

Accept-Encoding: gzip, desinfle

para solicitar la cabecera?

¿está asociado a este error? (Apesar de no ur utilizando Internet Explorer, puede ser útil)

Internet Explorer Loses the First 2048 Bytes of Data That Are Sent Back by Web Servers That Use HTTP Compression

+0

Hola, sí, he intentado configurar "gzip, defalte" como Aceptar codificación. Además, cuando intenté simplemente "desinflar" o "comprimir", WebService no comprimió la respuesta. Cuando estaba buscando errores relacionados con esto, encontré ese error, pero no creo que esté relacionado con él; Gracias por tu contribución. –

0

No estoy muy seguro de cómo eres cliente maneja la respuesta. Sin embargo, si puede interceptar el programa HttpResponse en forma matemática, podría intentar algo similar a usar un filtro de servlet para ajustar el HttpResponse y aumentar los encabezados.


public class HttpReponseWrapper extends HttpReponse 
{ 
    HttpResponse reponse; 
    public HttpResponseWrapper(HttpResponse response) 
    { 
    this.response = response; 
    } 

    public String getContentEncoding() 
    { 
     return "Content-Encoding=gzip"; 
    } 
} 
+0

Hola, ** hasta donde sé ** no es posible interceptar el HttResponse con JAX-WS. Gracias por tu contribución –

1

Básicamente necesita dos componentes. En primer lugar se debe crear un filter y agregarlo en web.xml como esto:

<filter> 
    <filter-name>yourFilter</filter-name> 
    <filter-class>yourFilterClassWhichAddsTheCorrectHeader</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>yourFilter</filter-name> 
    <url-pattern>theServletUrlMappedToJaxWS</url-pattern> 
</filter-mapping> 

siguiente puede que tenga que crear una wrapper of the response donde se agrega el encabezado faltante.

En realidad puede que no obtenga la envoltura necesita en absoluto, sólo falta establecer el encabezado directamente en el filtro se ha configurado en web.xml

Espero que esto ayude ...

Cuestiones relacionadas