如何在WSDL文档无Service标签的情况下创建SoapClient对象
问题解决方法
错误原因
SOAP-ERROR: Parsing WSDL: Couldn't bind to service错误触发的核心原因是ONVIF官方提供的公共WSDL文件仅定义了接口、消息、操作结构,没有内置service和port绑定节点,PHP SOAP扩展默认会尝试读取WSDL内的绑定信息,找不到就会抛出异常,不需要修改原始WSDL,仅调整初始化参数即可解决。
修复后的代码
<?php use SoapClient; $client = new SoapClient("http://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl", [ "cache_wsdl" => WSDL_CACHE_NONE, "location" => "http://192.168.1.55/onvif/device_service", "uri" => "http://www.onvif.org/ver10/device/wsdl", // 和WSDL的targetNamespace保持一致 "soap_version" => SOAP_1_2, // ONVIF协议强制要求使用SOAP 1.2 "features" => SOAP_SINGLE_ELEMENT_ARRAYS, // 统一返回结构,避免单个节点返回非数组格式 "service_name" => "DeviceService", "port_name" => "DevicePort" ]);
补充注意事项
- 后续调用需要鉴权的接口时,PHP原生SOAP扩展自带的WSSE头不符合ONVIF规范,需要手动组装符合要求的鉴权XML头加入请求
- 可以将WSDL和依赖的XSD文件下载到本地加载,避免受公网网络波动影响,同时大幅提升初始化速度
内容的提问来源于stack exchange,提问作者Emre Turan
相关产品推荐
相关产品推荐

