我目前正在使用suds包编写Python脚本以连接到新客户端。当我用url调用suds.Client时,我收到一个递归错误:
RuntimeError: maximum recursion depth exceeded while pickling an object
File "c:\Users\mdriscoll\Documents\projects\test_soap\test_soap.py", line 112, in <module>
main(sys.argv[1:])
File "c:\Users\mdriscoll\Documents\projects\test_soap\test_soap.py", line 100, in main
sendSOAPMsg(agency, fax_id, fax_num, setxid)
File "c:\Users\mdriscoll\Documents\projects\test_soap\test_soap.py", line 32, in sendSOAPMsg
client = Client('https://somerandomclient.com/blahblah.svc?wsdl')
File "c:\Users\mdriscoll\Documents\projects\test_soap\suds\client.py", line 112, in __init__
self.wsdl = reader.open(url)
File "c:\Users\mdriscoll\Documents\projects\test_soap\suds\reader.py", line 152, in open
d = self.fn(url, self.options)
File "c:\Users\mdriscoll\Documents\projects\test_soap\suds\wsdl.py", line 157, in __init__
self.open_imports()
File "c:\Users\mdriscoll\Documents\projects\test_soap\suds\wsdl.py", line 202, in open_imports
imp.load(self)
File "c:\Users\mdriscoll\Documents\projects\test_soap\suds\wsdl.py", line 314, in load
d = Definitions(url, options)
File "c:\Users\mdriscoll\Documents\projects\test_soap\suds\wsdl.py", line 136, in __init__
d = reader.open(url)
File "c:\Users\mdriscoll\Documents\projects\test_soap\suds\reader.py", line 80, in open
cache.put(id, d)
File "c:\Users\mdriscoll\Documents\projects\test_soap\suds\cache.py", line 336, in put
bfr = pickle.dumps(object, self.protocol)
起初,我认为这与之前在Stack上提到的问题有关:
但这是suds'chece.py中的一个问题。我尝试了以防万一提到的补丁,但它没有效果,补丁中添加的日志记录从未被调用过,所以我知道这不是问题所在。
我在Windows上使用suds 4.1 beta运行Python 2.6。注意:回溯中的url已被清除,因为我不允许提及他们的名字。
答案 0 :(得分:3)
我是开发此Web服务另一端的开发人员。 WSDL确实有一个循环引用。我已经解决了这个问题,迈克不再看到递归错误了。
就我而言,该服务是使用WCF在.NET框架上构建的。问题是由于我试图摆脱WSDL中的http://tempuri.org命名空间。我已将相应的命名空间添加到相应服务类的ServiceContract,DataContract和ServiceBehavior属性,但不知道服务器端点元素上的bindingNamespace配置值。这导致Visual Studio生成两个相互引用的WSDL文件,一个用于属于正确名称空间的元素,另一个用于tempuri.org名称空间中的绑定信息。
我发现以下博文非常有帮助: http://www.ilovesharepoint.com/2008/07/kill-tempuri-in-wcf-services.html
答案 1 :(得分:1)
或者,如果您知道使用的是.NET WCF服务,则可以将.svc?wsdl更改为.svc?singleWsdl,WCF服务器将为您处理递归。