2013-01-23 3 views
0

SOAP 클라이언트를 작성하고 있습니다. gSOAP 버전 2.7.17을 사용하고 있으며 서버가이 버전을 사용하고 있기 때문에 그 버전을 고수해야합니다. 이미이 필드에서 실행 중이므로 수정할 수 없습니다.gSOAP 빈 대답

SOAP 호출을 할 때 나는 항상 빈 응답을받습니다! 내가 네트워크를 도청 할 때 그러나 XML의 대답은 올바른 것 같다

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; 

:

여기
<?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 호출을 수행하는 방법에 대한 단순화 된 코드입니다 실제 출력 :

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

내가

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

이전에 작동했던 이전 구현이 있었지만 이것이 작동하고 있어야합니다! 내가 어디서 잘못한거야? 이미 이런 종류의 문제가 있었습니까? 모든 포인터를 강력하게 감사드립니다!

EDIT :

문제는 내 프로그램의 원래 버전에서 한 줄의 코드 변경없이 SOAP (2.7.14)의 이전 버전을 사용하여 "해결"하였다. 그러나, 나는 다시 중요한 것을 놓친다는 느낌이 든다. 나는 아마도 SOAP "정의"를주는 작은 헤더 파일을 조정하여 작업을 수행해야한다. ...

답변

0

코드를 보면 response을 선언하고 그 요소를 response.dResponse으로 참조한다. 이것은 응답이 구조체에 대한 포인터가 아니라 구조체이므로을 호출 한 다음 response의 버전을보고 한 후에 변경된 내용이 변경된 경우에만 m_soapProxy->unitCall의 복사본 만 변경됩니다.

나는 디버거에서이 호출을 추적하고 실제로 m_soapProxy->unitCall에서 발생하는 것을 확인하려고합니다. BTW 당신이 코드 또는 GSOAP에 의해 생성 된입니까?

+0

조언을 해주셔서 감사하지만 "unitCall"에 대한 참조가 필요하므로 변수가 업데이트되므로 서명 -> UMSLoginProxy :: unitCall (..., unitCallResponse 및 response)을 참조하십시오. 디버거를 사용할 때 SOAP에 의해 생성 된 unitCall 메서드의 끝에서 임시 변수를 내 참조로 복사하고 이미이 시점에 응답이 비어 있습니다. – morandg