gSoap C ++ - проблема десериализации C # - PullRequest
0 голосов
/ 07 января 2012

Я определил функцию с именем login, которая должна возвращать токен.Токен имеет идентификатор безопасности, который является символом *

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;

}

На стороне клиента у меня есть вызов:

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 равен нулю.Как-то это не десериализовано.С другой стороны, код ошибки, который является целым числом, правильно десериализован.

Есть предложения?

1 Ответ

0 голосов
/ 08 января 2012

Проблема исходит из файла wsdl. Глядя на документы gSOAP, я нашел:

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

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

В последнем примере элемент bar принадлежит пространству имен «urn: bar», поскольку пространством имен по умолчанию является «urn: bar». При импорте WSDL в Visual Studio .NET 2003 мы не смогли успешно десериализовать данные из ситуации с несколькими пространствами имен, когда элемент ответа содержит элемент типа структуры во втором пространстве имен. Отдельные члены структуры игнорировались на стороне .NET до тех пор, пока не была определена «квалифицированная» форма элемента по умолчанию.

Таким образом, установка attributeFormDefault = "qualised" и elementFormDefault = "qualised" устранила проблему сериализации.

...