我有一个使用PHP的SoapClient类调用的ASP .NET SOAP服务。通常,我调用的服务方法有效,但对于少数情况,它始终失败。当它失败时,服务将在大约90秒后超时。
我已经将问题的根本原因追溯到ASP .NET服务,它正在尝试反序列化提供的XML。在日志中,似乎.NET服务认为XML被截断:
System.Xml.XmlException:发生了意外的文件结尾。以下元素未关闭:ns1:描述,[...],SOAP-ENV:Body,SOAP-ENV:Envelope
System.InvalidOperationException:XML文档中存在错误(2,9383)
在我的PHP代码中,我通过调用$ client-> __ getLastRequest()来记录请求中使用的XML。正在提供的XML是有效的,并且没有任何可能破坏反序列化的异常字符。
为了使事情变得更奇怪,不仅一个请求失败了。我可以一直让三个请求失败。
其中两个请求的长度完全相同,并且在同一个字符中失败。 XML的请求长度为9576个字符,PHP发布的Content-Length标头为9615,字符9383上的服务失败。如果我在相关字符之前添加,删除或修改任何内容(字母“ d“),请求通过。失败的字符在两个请求中都是相同的字母和相同的位置。
虽然这是真的,但是第三个失败的请求是4812个字符,Content-Length标题是4852,并且在字符3863上失败。在这种情况下,字符不是相同的字符(它是字母“g”)它不在同一个XML节点内。
如果我向这些请求添加任何内容,甚至从中删除元素,它们都会很好。我不必删除或修改特定元素,只要它出现在反序列化失败的字符之前。
有没有人知道为什么这些请求会发生超时?有关潜在解决方法的任何建议吗?
答案 0 :(得分:0)
我的解决方法是 - 将POST请求中的内容长度设置为比实际length($request)-1
长一个字符。
感谢您的详细描述 - 我现在已经能够解决我自己的问题了!