0

打开 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 的单个实例运行,但单独不共享数据。

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

我得到的错误是:

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

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

4

2 回答 2

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中没有运行任何代码然后输入quit()关闭也会出现的退出IDLE的提示

编辑2:

尝试使用这里提到的一些技术(包括 last_sent 和 logging)来调试它

于 2012-09-10T18:35:57.537 回答
0

suds 默认不会出现此错误。在下面应用此补丁后出现:

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

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

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

于 2018-01-25T17:57:17.140 回答