我正在使用gSoap为ONVIF相机构建一个Web服务。 我使用ONVIF在https://www.onvif.org/profiles/specifications/提供的核心wdsl生成了头文件和源文件。
但是,每次我从客户端发出请求时,我都会在函数soap_begin_serve(soap)
中收到以下错误:
SOAP 1.2 fault SOAP-ENV:MustUnderstand[no subcode]
"The data in element 'Security' must be understood but cannot be processed"
上述错误意味着什么,我该如何解决?
编辑:这是我在相机方面收到的信息:POST / HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/device/wsdl/GetSystemDateAndTime"
Host: localhost:8090
Content-Length: 261
Accept-Encoding: gzip, deflate
Connection: Close
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetSystemDateAndTime xmlns="http://www.onvif.org/ver10/device/wsdl"/></s:Body></s:Envelope>POST / HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/device/wsdl/GetScopes"
Host: localhost:8090
Content-Length: 905
Accept-Encoding: gzip, deflate
Connection: Close
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>admin</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">WFz21zL8rch8LRoxAPzgHRMBbr0=</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">9y79ka0xD02oCIw6GAoIPwEAAAAAAA==</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2017-05-21T08:15:58.902Z</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetScopes xmlns="http://www.onvif.org/ver10/device/wsdl"/></s:Body></s:Envelope>
答案 0 :(得分:0)
SOAP 1.2错误SOAP-ENV:MustUnderstand [无子代码] &#34;元素&#39;安全&#39;中的数据必须理解,但不能处理&#34;
这意味着您需要启用WS-Security进行身份验证:
将#import "wsse.h"
添加到.h
头文件(也称为服务和数据绑定&#34;接口文件&#34;),以便soapcpp2进行处理。
#include "plugin/wsseapi.h"
,在使用soap_wsse_add_UsernameTokenDigest(soap, NULL, "username", "password");
发送请求之前提供用户凭据
使用编译器标志-DWITH_OPENSSL
编译源代码,并将您的应用程序代码库与plugin/wsseapi.c
,plugin/smdevp.c
和plugin/mecevp.c
(plugin
一起编译}目录在gSOAP发行版路径中),当然也编译stdsoap2.c
或stdsoap2.cpp
和其他生成的文件;
与OpenSSL -lssl -lcrypto
相关联,如果需要压缩,则可能-lz
;
在使用gSOAP(数字签名和/或加密)的完整WS-Security插件功能时,您应该使用编译器选项-DWITH_OPENSSL -DWITH_DOM -DWITH_GZIP
编译所有源代码,并且与您的代码一起编译dom.c
或dom.cpp
。
另请参阅the WS-Security plugin了解gSOAP。
希望这有帮助。