- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 JAX-WS 生成的客户端(使用 wsimport,与 Glassfish 2.1.1 捆绑在一起的客户端)连接到在 IIS 6 中运行的 ASP.NET 生成的 WebService。
当我在响应中请求压缩时(通过包含 HTTP header Accept-Encoding: gzip 通过 JAX-WS SOAP 处理程序),IIS 6 以压缩响应响应,但没有t 包含 Content-Encoding: gzip HTTP 响应 header ,所以我得到以下异常:
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 日编辑
I've also tried, using the same SOAPHandler I use for requesting compressed response, to modify the Response Headers, but the Exception occurs before the Handler is called.
结束编辑 2011 年 4 月 17 日
此外,当我通过 soapUI 3.6.1 向 WebService 发出相同的请求时,首选项为“接受来自主机的压缩响应”,我可以看到我所说的:IIS 6 服务器不包括 HTTP 响应 header 用于压缩,soapUI 将响应显示为“二进制数据”并显示这些响应 header :
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
如果 -with soapUI- 我不请求压缩响应我得到下一个响应大小:
Content-Length: 2665
因此,正如我所说,这里的问题是 IIS6 没有在响应中添加 Contend-Encoding header 。我的问题是:是否可以 - 以编程方式 - 添加 Content-Encoding header ?或者,它也可能是:是否可以要求 IIS6 包含 Content-Encoding header ?
更新
使用 Charles Web Debugging Proxy 3.5.2 我已经确认来自 IIS6 的响应不包含 Content-Encoding header :
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 相关的问题
最佳答案
基本上您需要两个组件。首先你必须创建一个 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添加缺少的 header 的位置。
实际上您可能根本不需要包装器,只需在您在 web.xml 中配置的过滤器中直接设置缺少的 header
希望这有助于...
关于Java:有没有办法更改接收到的 HTTP 响应 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646840/
我是一名优秀的程序员,十分优秀!