【问题标题】:gSoap C++ - C# deserialization issuegSoap C++ - C# 反序列化问题
【发布时间】:2012-01-07 13:38:43
【问题描述】:

我定义了一个名为 login 的函数,它应该返回一个令牌。令牌有一个安全 id,它是一个 char*

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 为空。不知何故,它不会被反序列化。 另一方面,错误代码,它是一个整数,被正确反序列化了。

有什么建议吗?

【问题讨论】:

    标签: c# c++ web-services gsoap


    【解决方案1】:

    问题来自 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”。使用 Visual Studio .NET 2003 WSDL 导入,当响应元素在第二个命名空间中包含结构类型的元素时,我们无法成功反序列化来自多命名空间情况的数据。结构的各个成员在 .NET 端被忽略,直到元素表单默认“合格”被定义。

    所以设置 attributeFormDefault="qualified" 和 elementFormDefault="qualified" 修复了序列化问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 1970-01-01
      • 2022-08-15
      • 2016-03-24
      相关资源
      最近更新 更多