Java:有没有办法更改收到的HTTP响应头?

Die*_*emo 6 java gzip iis-6 jax-ws

我正在使用JAX-WS生成的客户端(使用与Glassfish 2.1.1捆绑的wsimport)连接到IIS 6中运行的ASP.NET生成的WebService.
当我在响应中请求压缩时(通过包含HTTP头)Accept-Encoding: 通过JAX-WS SOAP处理程序gzip)IIS 6以压缩响应回答,但不包括Content-Encoding:gzip HTTP响应头,因此我得到以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

编辑于2011年4月17日

我也尝试使用我用于请求压缩响应的相同SOAPHandler来修改响应标头,但是在调用Handler之前发生了异常.

结束编辑2011年4月17日

此外,当我通过soapUI 3.6.1使用首选项"接受来自主机的压缩响应"向WebService发出相同的请求时,我可以看到我所说的内容:IIS 6服务器不包括用于压缩的HTTP响应头,和soapUI将响应显示为"二进制数据"并显示这些响应标头:

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
Run Code Online (Sandbox Code Playgroud)

如果--with soapUI-我不请求压缩响应我得到下一个响应大小:

Content-Length: 2665
Run Code Online (Sandbox Code Playgroud)

所以,正如我所说,问题是IIS6没有在响应中添加Contend-Encoding标头.我的问题是:是否有可能以编程方式添加Content-Encoding标头?或者,它也可能是:是否可以要求IIS6包含Content-Encoding标头?

更新
使用Charles Web调试代理3.5.2我已确认IIS6的响应不包含Content-Encoding标头:

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
Run Code Online (Sandbox Code Playgroud)

我猜这可能是一个与WebService相关的问题,而不是与IIS 6相关的问题

Vla*_*hev 0

JAX-WS 特定的解决方法是尝试将处理程序放入客户端的输入链中。该处理程序将访问 servlet 上下文,获取请求对象,查看有效负载,如果它以 GZ 特定序列开头,则将 HTTP 标头添加到现有标头列表中。

缺点:可能不起作用。我希望 HTTP 标头列表是一个不可变的集合。此外,内容的解析(和失败)可能会早于第一个处理程序获得控制权。

(我在这里有另一个建议——使用 HTTP 过滤器——但后来我意识到 JAX-WS 是一个客户端,并且不使用 web.xml)。