创建指向同一wsdl的多个suds客户端

时间:2012-09-10 15:46:43

标签: python suds

打开IDLE并导入suds客户端,我可以通过以下方式创建客户端:

c = Client('http://blah/Core.svc?wsdl')

随后致电:

c2 = Client('http://blah/Core.svc?wsdl')

会引发TypeNotFound错误,在wsdl文件中命名一个类。

我试过了:

timeout = 5 # and then waiting
cache = None

但是同样的错误发生了。我不介意我是否不能使用第一个实例,但我如何抓住第二个?

我正在编写测试,这些测试将由PySys的单个实例运行,但它们不会共享数据。

顺便说一下,当我在此之后退出()IDLE时,它会询问我是否要终止正在运行的进程,所以我在假设创建一个客户端触发一个线程时是否正确?

我得到的错误是:

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    c1 = Client('http://localhost:8090/Service/Core.svc?wsdl')
  File "build\bdist.win-amd64\egg\suds\client.py", line 119, in __init__
    sd = ServiceDefinition(self.wsdl, s)
  File "build\bdist.win-amd64\egg\suds\servicedefinition.py", line 58, in __init__
    self.paramtypes()
  File "build\bdist.win-amd64\egg\suds\servicedefinition.py", line 137, in paramtypes
    item = (pd[1], pd[1].resolve())
  File "build\bdist.win-amd64\egg\suds\xsd\sxbasic.py", line 63, in resolve
    raise TypeNotFound(qref)
TypeNotFound: Type not found: '(ClassName, http://schemas.datacontract.org/4004/07/Class.Namespace, )'

c.last_received()和c.last_sent()都是空的。

更进一步,我查看了我的IIS日志,发现每当我第一次在python实例中调用Client(url)时,我得到:

GET /Service/Core.svc   wsdl    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd0    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd2    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd1    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd3    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd2    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd1    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd3    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd2    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd1    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd3    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd2    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd3    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd1    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd2    8090    -   ::1 Python-urllib/2.6   
GET /Service/Core.svc   xsd=xsd3    8090    -   ::1 Python-urllib/2.6   

但是来自同一个python实例的后续调用给了我:

GET /Service/Core.svc   wsdl    8090    -   ::1 Python-urllib/2.6
GET /Service/Core.svc   xsd=xsd0    8090    -   ::1 Python-urllib/2.6
GET /Service/Core.svc   xsd=xsd2    8090    -   ::1 Python-urllib/2.6
GET /Service/Core.svc   xsd=xsd3    8090    -   ::1 Python-urllib/2.6
GET /Service/Core.svc   xsd=xsd1    8090    -   ::1 Python-urllib/2.6
GET /Service/Core.svc   xsd=xsd2    8090    -   ::1 Python-urllib/2.6
GET /Service/Core.svc   xsd=xsd3    8090    -   ::1 Python-urllib/2.6

每次请求某个文件时,响应的大小都相同。

2 个答案:

答案 0 :(得分:1)

这可能是其他地方的问题(即提供WSDL的服务),因为我在使用SOAP服务时无法在IDLE或python命令shell或脚本(我正在使用Windows)中重现。

你能提供确切的错误,suds的版本和有问题的WSDL的实际URL吗?

无论我如何尝试,以下输出都是相同的。

>>> from suds.client import Client
>>> c1 = Client('http://vocab.nerc.ac.uk/vocab2.wsdl')
>>> c2 = Client('http://vocab.nerc.ac.uk/vocab2.wsdl')
>>> c1
<suds.client.Client object at 0x022AE230>
>>> c2
<suds.client.Client object at 0x022CCDB0>
>>>

编辑:

关于退出IDLE的通知,即使您在IDLE中没有运行代码,然后键入quit()以关闭

编辑2:

尝试使用here提到的一些技术(last_sent和logging)来调试它

答案 1 :(得分:0)

suds默认值中不会出现此错误。 这在以下this patch后面显示:

recurselevel-schema.py.patch https://github.com/sandersnewmedia/suds/blob/master/suds/xsd/recurselevel-schema.py.patch

在文件中 /suds/xsd/schema.py

此补丁解决了“递归级别架构错误”,但是当您需要使用指向同一个wsdl的多个suds客户端时会导致错误。