2011-12-29 46 views
2

我有一個使用PHP的SoapClient類調用的ASP .NET SOAP服務。通常,我所調用的服務方法是有效的,但對於少數情況,它始終會失敗。當它失敗時,服務將在約90秒後超時。ASP .NET SOAP服務無法爲某些請求反序列化XML

我已經將問題的根本原因追溯到ASP .NET服務,它試圖反序列化提供的XML。在日誌中,似乎.NET服務認爲XML被截斷:

System.Xml.XmlException:發生意外的文件結尾。以下元素未封閉:NS1:說明,[...],SOAP-ENV:機身,SOAP-ENV:信封

System.InvalidOperationException:有是XML文檔中的誤差(2,9383)

在我的PHP代碼中,我通過調用$ client - > __ getLastRequest()來記錄請求中使用的XML。正在提供的XML是有效的,並且不存在可能破壞反序列化的任何異常字符。

爲了讓事情變得更奇怪,它不僅僅是一個單一的請求失敗。我可以始終使三個請求失敗。

其中兩個請求的長度完全相同,並且在同一個字符上失敗。 XML的請求長度爲9576個字符,由PHP發佈的Content-Length標題爲9615,服務在字符9383上失敗。如果我在有問題的字符之前添加,刪除或修改任何內容(字母「 d「),請求就會通過。失敗的角色是兩個請求中的同一個字母和相同的地方。

雖然這是真的,但第三個失敗的請求是4812個字符,具有4852的內容長度標題,並且在字符3863上失敗。在這種情況下的字符不是相同的字符(它是字母「g」 ),它不在同一個XML節點中。

如果我向這些請求添加任何內容,甚至刪除它們中的元素,它們都會通過。只要它發生在反序列化失敗的字符之前,我就不必刪除或修改某個特定元素。

有沒有人有任何想法爲什麼這個超時可能會發生這些請求?任何有關潛在解決方法的建議?

回答

0

我的解決方法是 - 將您的POST請求中的內容長度設置爲比實際長度小一個字符的長度length($request)-1

感謝您的詳細描述 - 我現在已經能夠解決我自己的問題!