2011-04-13 58 views
6

我使用JAX-WS生成的客户端(使用wsimport,与Glassfish 2.1.1捆绑在一起)连接到在IIS 6中运行的ASP.NET生成的WebService。
当我在响应中请求压缩时通过包括HTTP标头接受编码:gzip通过JAX-WS SOAP处理程序)IIS 6回答压缩响应,但不包括内容编码:gzip HTTP响应标题,所以我得到以下例外:Java:有没有更改接收到的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) 

编辑的2011年4月17日

我也试过,使用相同的 SOAPHandler我用请求 压缩响应,修改 响应头,但异常 发生处理程序被调用之前。

编辑完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 

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

Content-Length: 2665 

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

UPDATE
使用查尔斯Web调试代理3.5.2我已确认从IIS6响应不包括内容编码头:

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 

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

+1

你看bug报告?这看起来像是IIS中的一个严重错误,因为它显然违反了HTTP 1.1规范。我不认为有可能从客户端入侵头部,因为一旦控制权到达您的代码,所有的HTTP处理都会完成。 – musiKk 2011-04-13 09:36:52

+1

嗨@musiKk,我在最后一条评论中看到了[这里](http://forums.iis.net/t/1160183.aspx):“我已经说过,在响应标题上,有两个实体缺失:Vary接受编码和内容编码gzip“ – 2011-04-13 10:19:18

+0

你可以使用Apache CXF作为你的JAX-WS提供者吗? CXF可能是有可能的,但如果你被RI困住了,我就不会去调查了。 – mtpettyp 2011-04-26 20:18:58

回答

0

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

缺点:可能无法正常工作。我期望HTTP头的列表是一个不可变的集合。此外,解析内容(和失败)可能会比第一个处理程序更早发生,从而获得控制权。 (我在这里有另一个建议 - 使用HTTP过滤器 - 但后来我意识到JAX-WS是一个客户端,并且不使用web.xml)。

+0

嗨,我已经尝试在** SOAPHandler **(与我用来请求压缩响应相同)的响应头中添加“Content-Encoding”,但似乎甚至在Handler叫做。感谢您的输入。 – 2011-04-17 13:52:54

0

你尝试加入

接受编码:gzip,紧缩

请求头?

是否与此错误关联? (eventhough UR不使用IE浏览器,可能会有所帮助)

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

+0

嗨,是的,我试过将“gzip,defalte”设置为Accept-Encoding。另外,当我尝试“放气”或“压缩”时,WebService并未压缩响应。当我查找与此相关的错误时,我发现了这个错误,但我认为它并不相关;感谢您的输入。 – 2011-04-17 13:47:12

0

我也不太清楚,你是如何处理客户端的响应。但是,如果您可以拦截HttpResponse programmaticaly,您可以尝试类似于使用servlet过滤器来包装HttpResponse并扩充标头。


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

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

嗨,**到我知道的地方**不可能用JAX-WS拦截HttResponse。感谢您的输入 – 2011-04-19 12:58:07

1

基本上你需要两个组件。首先,你必须创建一个filter在web.xml中添加它作为这样的:

<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> 

接下来,您可能需要创建一个wrapper of the response在其中添加缺少的标题。

其实你可能会不需要包装可言,只是直接设置缺少的头在你在web.xml

希望这有助于配置的过滤器...

相关问题