2012-01-07 3 views
0

토큰을 반환해야하는 login이라는 함수를 정의했습니다.gSoap C++ - C# deserialization 문제

AuthenticationServiceClient a = new AuthenticationServiceClient(); 
Login login = new Login(); 
login.user = "test"; 
login.password = "test"; 
LoginResponse lr = a.login(login); 

string securityId = lr.token.sessionId 

문제는 secuirtyId가 null이다 : 토큰 내가이에 대한 호출을 클라이언트 측에 숯불 *

SOAP_FMAC5 int SOAP_FMAC6 __afas__login(struct soap* env, afas__Login *afas__login, afas__LoginResponse *afas__loginResponse) 
{ 

    int ret = ServiceApp::GetServiceApp()->GetServiceImpl()->login(afas__login->user, afas__login->password); 

    afas__loginResponse->error = soap_new_afas__Error(env, -1); 
    afas__loginResponse->af__token = soap_new_af__Token(env, -1); 

    if (ret == sERROR) 
    { 
     afas__loginResponse->error->code = afas__ErrorCode__NOTLOGGEDIN; 
    } 
    else 
    { 
     afas__loginResponse->error->code = afas__ErrorCode__SUCCESS; 

     afas__loginResponse->af__token->sessionId = soap_strdup(env, soap_int2s(env, ret)); 
     afas__loginResponse->af__token->securityId = soap_strdup(env, afas__login->password); 

     afas__loginResponse->af__token->userName = soap_strdup(env, afas__login->user); 
    } 

    return SOAP_OK; 

} 

에게있는 보안 ID가 있습니다. 어떻게 든 비 직렬화되지 않습니다. 반면에 정수 인 오류 코드는 올바르게 deserialize됩니다.

제안 사항?

답변

0

문제는 wsdl 파일에서 발생합니다. gSOAP의 문서를 보면 내가 발견 바 요소는 "항아리 : 바"에 속하는 마지막 예에서

http://www.cs.fsu.edu/~engelen/soapfaq.html

<x:foo xmlns:x="urn:foo" xmlns="urn:bar"> 
    <bar></bar> 
</x:foo> 

네임 스페이스 기본 네임 스페이스이기 때문에 "항아리 : 바". Visual Studio .NET 2003 WSDL 가져 오기를 사용하면 response 요소에 두 번째 네임 스페이스에 struct 형식의 요소가 포함되어있는 경우 다중 네임 스페이스 상황에서 데이터를 성공적으로 deserialize 할 수 없습니다. 요소 폼 기본값 인 'qualified'가 정의 될 때까지 .NET 측에서 구조체의 개별 멤버가 무시되었습니다.

그래서 attributeFormDefault = "qualified"및 elementFormDefault = "qualified"로 설정하면 직렬화 문제가 해결되었습니다.