如何使JAXWS在SOAP响应上发送内容长度的报头



基本上,我使用JAXWS创建了一个web服务。它使用SOAP并且可以工作。然而,在一些请求中,一些客户端崩溃/错误,这似乎与JAXWS web服务没有发送内容长度报头有关。有办法加吗?

使用:openjdk-6 (6b20)

我的类是这样的:

import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.ws.Endpoint;
@WebService
public class SOAP {
public static void main(String[] args) {
    try {
        SOAP server = new SOAP();
        Endpoint endpoint = Endpoint.publish('localhost:1234', server);
    } catch (Exception e) {
                Utils.getLog("SOAP").fatal("General Error", e);
    }
}
}

使用tcpdump确认响应中没有内容长度:

0x0000:  4500 00b0 4da5 4000 4006 20d5 5cf3 1021  E...M.@.@.....!
0x0010:  5cf3 01c7 13b2 bcea a9be 716e 14c3 16a1  .........qn....
0x0020:  8018 006c cc70 0000 0101 080a 2e1b 3ccc  ...l.p........<.
0x0030:  2e18 23a2 4854 5450 2f31 2e31 2032 3030  ..#.HTTP/1.1.200
0x0040:  204f 4b0d 0a54 7261 6e73 6665 722d 656e  .OK..Transfer-en
0x0050:  636f 6469 6e67 3a20 6368 756e 6b65 640d  coding:.chunked.
0x0060:  0a43 6f6e 7465 6e74 2d74 7970 653a 2074  .Content-type:.t
0x0070:  6578 742f 786d 6c3b 6368 6172 7365 743d  ext/xml;charset=
0x0080:  2275 7466 2d38 220d 0a44 6174 653a 2053  "utf-8"..Date:.S
0x0090:  6174 2c20 3137 2053 6570 2032 3031 3120  at,.17.Sep.2011.
0x00a0:  3134 3a31 393a 3337 2047 4d54 0d0a 0d0a  14:19:37.GMT....

所以我的问题是,有没有一种方法告诉webservice发送内容长度与回复?或者在发送回复之前附加它的方法?

您可以通过编写处理程序将HTTP头添加到传出响应中。您的处理程序将扩展标准的JAX-WS处理程序,并在handleMessage(C上下文)方法中使用MessageContext来修改HTTP_RESPONSE_HEADER属性(实际上是映射中的一个键)。例如,你的处理器将是:

public class MyHandler<SOAPMessageContext> implements Handler {
    public boolean handleMessage(SOAPMessageContext c) {
        if((Boolean)c.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)) {
            c.put(SOAPMessageContext.HTTP_RESPONSE_HEADERS,"your header stuff here");
            return true;
        }
    }
 }

您需要创建一个处理程序链文件,并在端点类中添加一个指向该文件的注释。注释是@HandlerChain(file="…");

一旦你这样做,你应该能够修改HTTP报头在进出。HTH .

我有一个类似的问题,提供程序不接受分组消息…它也不会设置报头中的内容长度,实际上会将消息分组,web服务提供商会拒绝我的呼叫……这是使用JAX-WS和Axis2 1.6作为JAX-WS运行时。

我尝试添加HTTP头来手动添加Content-length,但这会导致其他问题。我最终通过设置HTTPConstants使其工作。在处理程序中的SOAPMessageContext上CHUNKED为false。

我的博客在这里:http://btarlton.blogspot.com/2013/03/jax-ws-with-axis2-how-to-disable.html#!/2013/03/jax-ws-with-axis2-how-to-disable.html

使用Axis2作为JAX-WS运行时,这是我能找到的唯一修复。

最新更新