【问题标题】:Python suds - Recursion error in wsdl.pyPython suds - wsdl.py 中的递归错误
【发布时间】:2013-06-18 15:10:50
【问题描述】:

我目前正在编写一个使用 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 的 schema.py 中的一个问题。我尝试了提到的补丁以防万一,但它没有效果,并且从未调用补丁中添加的日志记录,所以我知道这不是这里的问题。

我在 Windows 上使用 suds 4.1 beta 运行 Python 2.6。注意:回溯中的 url 已被清除,因为我不允许提及他们的名字。

【问题讨论】:

  • pickle 试图转储的对象中是否有任何循环引用?
  • 我不知道。当我调用 client = suds.client.Client(url) 时会发生这种情况,因此它发生在库代码本身内部。我也在查看原始 WSDL“代码”,但我对 SOAP 不够熟悉,不知道要查找什么。

标签: python soap suds


【解决方案1】:

我是该 Web 服务另一端的开发人员。 WSDL 中确实存在循环引用。我已经解决了这个问题,Mike 不再看到递归错误。

就我而言,该服务是使用 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

【讨论】:

    【解决方案2】:

    或者,如果您知道自己正在使用 .NET WCF 服务,您只需将 .svc?wsdl 更改为 .svc?singleWsdl,WCF 服务器就会为您处理递归。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多