我正在使用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>
但由于这些原因,这是不可能的:
<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文件(添加上面的Node)时,一切正常。
请问,好吗?我有一段时间的战斗,所以我需要踢一点。
谢谢。
答案 0 :(得分:1)
service = client.create_service()应该可以工作(另请参阅https://github.com/mvantellingen/python-zeep/issues/106了解相同的wsdl)。
您是否在后续调用中使用创建的服务对象(例如service.Operation()
而不是客户端?