gSoap fault SOAP-ENV:MustUnderstand [no subcode]

时间:2017-05-20 10:51:35

标签: visual-c++ soap gsoap onvif

我正在使用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>

1 个答案:

答案 0 :(得分:0)

  

SOAP 1.2错误SOAP-ENV:MustUnderstand [无子代码]   &#34;元素&#39;安全&#39;中的数据必须理解,但不能处理&#34;

这意味着您需要启用WS-Security进行身份验证:

  1. #import "wsse.h"添加到.h头文件(也称为服务和数据绑定&#34;接口文件&#34;),以便soapcpp2进行处理。

  2. 您的源代码中的
  3. #include "plugin/wsseapi.h"

  4. 在您的源代码中
  5. ,在使用soap_wsse_add_UsernameTokenDigest(soap, NULL, "username", "password");发送请求之前提供用户凭据

  6. 使用编译器标志-DWITH_OPENSSL编译源代码,并将您的应用程序代码库与plugin/wsseapi.cplugin/smdevp.cplugin/mecevp.cplugin一起编译}目录在gSOAP发行版路径中),当然也编译stdsoap2.cstdsoap2.cpp和其他生成的文件;

  7. 与OpenSSL -lssl -lcrypto相关联,如果需要压缩,则可能-lz;

  8. 在使用gSOAP(数字签名和/或加密)的完整WS-Security插件功能时,您应该使用编译器选项-DWITH_OPENSSL -DWITH_DOM -DWITH_GZIP编译所有源代码,并且与您的代码一起编译dom.cdom.cpp

  9. 另请参阅the WS-Security plugin了解gSOAP。

    希望这有帮助。