2

我正在使用 ONVIF 协议实现应用程序。我必须使用一个 WSDL 文件https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl 。但需要定义默认服务,将以下代码添加到 WSDL 文件中:

<wsdl:service name="DeviceService">
    <wsdl:port name="DevicePort" binding="tds:DeviceBinding">
        <soap:address location="http://ip_address/onvif/device_service"/>
    </wsdl:port>
</wsdl:service>

但由于以下几点,这是不可能的:

  1. 要将节点添加到 WSDL 文件中,您必须下载 WSDL 文件(这不是真正的问题,因为我下载了文件由于性能 - 现在)
  2. 该应用程序应与各种网络中的许多 IP 摄像机通信,因此无法定义行:<soap:address location="http://ip/onvif/device_service"/>

所以我一直在寻找一些解决方案,我在 Zeep 文档(http://docs.python-zeep.org/en/master/client.html#creating-new-serviceproxy-objects)中找到了它,其中写着:

在某些情况下,您需要更改 WSDL 中定义的 SOAP 地址,或者WSDL 没有定义任何服务元素。

所以我试着这样称呼:

client = Client(
    wsdl = '/path/to/local/wsdl_file.wsdl',
    wsse = self.InitSecurity(),
    service_name = 'DeviceService',
    port_name = 'DevicePort'
)

service = client.create_service(
    '{http://www.onvif.org/ver10/device/wsdl}DeviceBinding',
    'http://ip_address/onvif/device_service'
)

但是当我运行脚本时,会引发以下异常:

ValueError:没有定义默认服务。这通常是由于 WSDL 中缺少 wsdl:service 定义

当我直接修改 WSDL 文件(添加上面的节点)时,一切正常。

请问有什么想法吗?我正在战斗一段时间,所以我需要踢一点。

谢谢你。

4

1 回答 1

2

service = client.create_service() 应该可以工作(对于相同的 wsdl,另请参见https://github.com/mvantellingen/python-zeep/issues/106 )。

您是否将创建的服务对象用于后续调用(例如service.Operation(),而不是客户端?

于 2017-02-20T19:04:24.477 回答