0

私はSOAPクライアントを書いています。私は gSOAP バージョン 2.7.17 を使用していますが、サーバーがこれを使用しているため、そのバージョンに固執する必要があり、フィールドで既に実行されているため変更できません。

SOAP 呼び出しを行うと、常に空の応答が返されます。ただし、ネットワークをスニッフィングすると、XML の回答は正しいようです。

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:Supervisor="urn:Supervisor"
    xmlns:ActiveLogin="urn:ActiveLogin" xmlns:TechLogin="urn:TechLogin"
    xmlns:UMSLogin="urn:UMSLogin">
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <unitCallResponse>
            <szServerName>UMS_DEV_LANCC2 (2)</szServerName>
            <dResponse>cUNITRETURNCODE_RESTARTIMMEDIATE</dResponse>
            <dDetail>cBla</dDetail>
        </unitCallResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

これは、 soapcpp2で生成されたプロキシを使用して SOAP 呼び出しを実行する方法に関する簡略化されたコード スニペットです。

UMSLogin::unitCallResponse response;    // Response from SOAP
UMSLogin::UMSLoginProxy* m_soapProxy =  // The SOAP proxy
    new UMSLogin::UMSLoginProxy(SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE);

callRes = m_soapProxy->unitCall(m_eUnitType, serial, m_dInterfaceVersion,
    xl2CallTypeToUmsLoginCallType(m_pSoapEndPoint->getCallType()),
    xl2CommTypeToUmsLoginCommType(m_pSoapEndPoint->getComType()),
    response);

logDebug(LOG_COM_DEVICE, "SOAP call done to %s, SOAP code %i, central code %i",
    response.szServerName.c_str(), callRes, response.dResponse);

m_soapProxy->soap_close_socket();
m_soapProxy->destroy();
delete m_soapProxy;

実際の出力:

SOAP call done to , SOAP code 0, central code 0

期待すると

SOAP call done to UMS_DEV_LANCC2 (2), SOAP code 0, central code 5
/* 5 ->  cUNITRETURNCODE_RESTARTIMMEDIATE */

以前は機能していた古い実装がありましたが、これは機能しているに違いありません! どこが間違っていますか?誰かがすでにこの種の問題を抱えていましたか?どんなポインタでも大歓迎です!

編集:

私のプログラムの元のバージョンからコードを1行も変更せずに、以前のバージョンのSOAP(2.7.14)を使用することで、問題は「解決」されました。しかし、また何か大事なものを逃した気がします!SOAPの「定義」を提供して、ヘッダーファイルを少し調整して、機能させる必要があります...

4

1 に答える 1

0

コードを見て、宣言responseし、その要素をとして参照しますresponse.dResponse。これは、応答が構造体へのポインタではなく構造体であることを意味しているようです。そのため、m_soapProxy->unitCallそのバージョンを呼び出した後response、レポートするバージョンは変更されておらず、コピーインのみm_soapProxy->unitCallが変更されます。

デバッガーでこの呼び出しをトレースして、で実際に何が起こっているかを確認しますm_soapProxy->unitCall。ところで、それはあなたがコーディングするのですか、それともGSOAPによって生成されるのですか?

于 2013-01-24T11:15:19.070 に答える