我正在尝试从Axis2网络服务向客户端发送附件。问题是客户端从服务接收的消息上下文不包含任何附件,尽管最后一个似乎添加了它。 这是双方的简要代码。 服务:
MessageContext inMC = MessageContext.getCurrentMessageContext();
OperationContext operationContext = inMC.getOperationContext();
MessageContext outMC = operationContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
DataHandler handler = new DataHandler (new FileDataSource("C://goods.xml"));
String attachID = outMC.addAttachment(handler);
OMElement idElem = factory.createOMElement("doc", ns);
idElem.addAttribute("href", "cid:" + attachID, ns);
客户端(尝试接收附件):
MessageContext mcResponse = operationClient.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
SOAPBody body = mcResponse.getEnvelope().getBody();
OMElement attachElem = body.getFirstChildWithName (new QName("doc"));
String attachID = attachElem.getAttributeValue (new QName("href"));
attachID = attachID.replaceFirst("cid:", "");
DataHandler dataHandler = mcResponse.getAttachment(attachID);
getAttachment()方法返回null。如果调试客户端应用程序,IDE显示,输入消息上下文中的附件映射不包含任何元素(size = 0)。 OMElement对象(idElem),包含附件ID,由客户端正常接收和读取(debug显示cid)。参数enableSwA,cacheAttachments,attachmentDIR,sizeThreshold都在services.xml和客户端的编程部分中设置。消息上下文有什么问题? 非常感谢任何建议。
更新:TCPmon显示以下内容。 请求服务:
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><getXMLFile xmlns="http://axis2.apache.org"><filename>goods.xml</filename></getXMLFile></soapenv:Body></soapenv:Envelope>
我猜没关系:)。
服务响应:
109
<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><doc href="cid:d06f3b36afdfcbd2e135ecfbcad05ee602661262b059ed38@apache.org"></doc></soapenv:Body></soapenv:Envelope>
0
我为一些简单的问题道歉,但附件应该反映在哪里?我猜,如果服务发送附件,SOAP消息包含二进制数据,不是吗? 我还检查了将附件放入服务端的消息上下文中 - 没关系,我可以在添加后从上下文中获取它。
答案 0 :(得分:2)
您可以使用tcpmon [1]跟踪http消息并隔离问题。
无论如何,处理附件的更好方法是使用MTOM。这可以与ADB [2]等数据绑定框架一起使用,也可以与POJO一起使用。
感谢, Amila。
[1] http://ws.apache.org/commons/tcpmon/
[2] http://amilachinthaka.blogspot.com/2009/01/using-mtom-with-axis2.html
答案 1 :(得分:1)
问题解决了。问题出在服务方面。 TCPmon显示响应消息中没有附件。但是,相同的example service工作正常。检查并比较我的服务上的每个操作后,发现编程部分也不是原因。唯一的一个是 - 服务设置。因此,原因是服务上的service.xml文件中的设置字段(需要布尔类型)不允许任何附加符号。我的错误:
不正确:
<parameter name="enableSwA">
true
</parameter>
正确:
<parameter name="enableSwA">true</parameter>