2011-09-05 204 views
2

我正在從Apache Axis 1.4 Java客戶端調用Web服務。該呼叫正確到達服務器,但客戶在大約幾分鐘後拋出此異常:SAXParseException:XML文檔結構必須在同一實體內開始和結束

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服務調用返回大量數據。如果我將服務器配置爲返回更少的數據,則呼叫會成功完成。

注意:儘管我沒有收到任何客戶端超時異常,但我嘗試將超時值增加到五分鐘,但這沒有效果。

回答

4

Apache Axis 1.4默認支持HTTP 1.0。被調用的服務器使用HTTP 1.1,它顯然支持分塊傳輸編碼。

w3.org

分塊編碼修改一個消息的主體,以便將其傳送作爲一系列塊,每個具有其自己的大小指示符,然後是包含實體頭字段的可選拖車。這允許動態生成的內容與收件人必需的信息一起傳送,以驗證收件人已收到完整信息。

這意味着Axis 1.4對HTTP響應中的塊不知道,並可能在接收所有塊之前關閉連接。當它試圖反序列化SOAP消息時,它會抱怨XML格式不正確,並且缺少一些結束標記,這是因爲它沒有完整的SOAP響應。

解決方案是將Axis配置爲默認使用支持HTTP 1.1的CommonsHTTPSender。

<?xml version="1.0" encoding="UTF-8"?> 
<deployment name="ApacheCommonsHTTPConfig" xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 

<globalConfiguration> 

    <parameter name="disablePrettyXML" value="true"/> 

    <parameter name="enableNamespacePrefixOptimization" value="false"/> 

</globalConfiguration> 

<transport name="http" pivot="java:org.apache.axis.transport.http.CommonsHTTPSender" /> 

<transport name="local" pivot="java:org.apache.axis.transport.local.LocalSender" /> 

<transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender" /> 

</deployment> 

相關的設置與名稱運輸的「http:您可以通過在組織/阿帕奇/軸/客戶端/客戶config.wsdd中有以下內容將在classpath中一個客戶config.wsdd中做到這一點」。 大多數應用程序服務器已經將這個類加載到他們的類路徑中,以防萬一您不需要將Apache Commons HTTP jar添加到您的類路徑中。

+0

工程就像一個魅力!謝謝@Zak! –

相關問題