SAXParseException:XML文档结构必须在同一实体中开始和结束

我正在从Apache Axis 1.4 Java客户端调用Web服务。 呼叫正确到达服务器,但客户端在大约几分钟后抛出此exception:

AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: org.xml.sax.SAXParseException: XML document structures must start and end within the same entity. faultActor: faultNode: faultDetail: 

例外情况并不总是一样的。 有时它会在响应中指定一个特定元素:

 AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: org.xml.sax.SAXParseException: The element type "name" must be terminated by the matching end-tag "</name>". faultActor: faultNode: faultDetail: 

我正在进行的Web服务调用返回大量数据。 如果我将服务器配置为返回较少的数据,则呼叫成功完成。

注意:虽然我没有得到任何客户端超时exception,但我尝试将超时值增加到五分钟,但这没有任何效果。

Apache Axis 1.4默认支持HTTP 1.0。 被调用的服务器正在使用HTTP 1.1,它显然支持Chunked Transfer Encoding。

来自w3.org :

分块编码修改消息的主体,以便将其作为一系列块传输,每个块都有自己的大小指示符,然后是包含实体头字段的可选预告片。 这允许动态生成的内容与接收者validation其已收到完整消息所需的信息一起传输。

这意味着Axis 1.4对HTTP响应中的块没有任何了解,并且可能在接收所有块之前关闭连接。 当它试图反序列化SOAP消息时,它抱怨XML没有很好地形成并且缺少一些结束标记,这是预期的,因为它没有完整的SOAP响应。

解决方案是将Axis配置为使用默认支持HTTP 1.1的CommonsHTTPSender。 您可以通过在org / apache / axis / client / client-config.wsdd下的类路径上添加client-config.wsdd来实现此目的,其中包含以下内容:

           

相关设置是名为“http”的传输。 大多数应用程序服务器已经在其类路径中加载了此类,以防您不需要将Apache Commons HTTP jar添加到类路径中。