关于SOAP问题(有这方面实际经验的朋友千万不能错过!)(200分)

  • 主题发起人 superkieth
  • 开始时间
S

superkieth

Unregistered / Unconfirmed
GUEST, unregistred user!
在开发SOAP程序时,遇到难题:客户端用C++BUILDER6。0+UPDATE2
服务端用VC6+microsoft SOPATOOLKIT3。准备实现客户端和服务器端传递
对象数组,即自定义一个结构体mylist,而传递的是mylists,在实现传递
mylist没有问题,而传递mylists时不能传递,在CB跟踪时发现mylists数组
为0,请问什么原因?
另为客户端在安装SOPATOOLKIT3后,用C++BUILDER6开发的SOAP服务端不能输出
WSDL。
前一个问题比较急,焦急等待中...
 
怎么没有人回答,是分不够还是问题简单不屑回答。
伤心,看来在大富翁上越来越不能解决一些实际问题了。
 
这里用VC的人可能比较少吧
我在做的时候一般是将数据捆成数据包,通过流来传递
参考李维的《Delphi6/Kylix2 Soap/Web Service程序设计篇》
 
用VC没试过,.NET还略知一二.
SOAPTOOLKIT太麻烦
 
现在我碰到的是:假如我自定义类:
TmyList
{
int cout;
AnsiString title;
}
typedef DynamicArray<TmyList*> ArrayOfmyList
TmySum
{
int number;
ArrayOfmyList myLists;
}
typedef DynamicArray<TmySum*> ArrayOfmySum
定义方法:
ArrayOfmyList GetLists();
ArrayOfmySum GetSums();

当然类都从TRemotable继承。当执行方法GetLists()和GetSums()都成功,GetLists()
结果正常。但在GetSums()返回的TmySum中ArrayOfmyList为空数组。问题是为什么会
这样(服务器端是VC),通过监控数据包,TmySum中的ArrayOfmyList数据已经过来的。
问题是客户端。难道ArrayOfmyList为复杂数据类型,要自己实现NativeToXS等方法,又
如何实现?谁能告诉我?

 
to superkieth:你自己分析的道理,李维的书中写道,当复杂数据类型的成员是指针(你的是),类,对象时,
必须覆盖TRemotableXS类的ativeToXS和XSToNative虚拟方法。不过具体怎么做书中也没有详细说。
 
to jinmen:
但我服务端和客户端全部采用cb开发时,我不用实现ativeToXS和XSToNative虚拟方法
也成功传递。服务端用VC TOOLKIT就出现以上问题。
另李维的书中写的复杂数据类型我认为是象Tdatetime类型需序列化,而自定义的类等
应该不需要。
 
to superkieth:你说的不完全对,自定义的类型必须要序列化(marshaling),你把你定义的
类型从TRemotable继承实际上就是让系统帮你做序列化的过程。我对C++语法不是很熟,
但是你定义的ArrayOfmyList类型应该是指针类型(TmyList*),所以我认为应该要重载虚拟
方法。当然,如果真的“服务端和客户端全部采用cb开发时,我不用实现ativeToXS和XSToNative虚拟方法
也成功传递”,那就说明不是序列化问题,可能是MSSOPATOOLKIT的使用上有问题。
 
是MSSOAPTOOL KIT的问题,不知道是怎么回事。我用DELPHI开发WS,因为装了它,也不能返回
复合类型数组,删掉就正常了。
 
to jinmen:
是的,自定义的类型必须要序列化,从TRemotable继承实际上就是让系统做序列化。
当然,如果你觉得你想按照自己的意愿输出SOAP包,也可以把类按照自己的方式序列化。
我现在的问题是一方面MSSOAPTOOL KIT3.0与cb的服务端输出WSDL有问题
(可能MSSOAPTOOL KIT3.0中MSXML4。0与cb输出的XML有些不兼容,没有时间深入研究),
如果服务端用CB开发,那么服务器不能装MSSOAPTOOL KIT3.0,但服务器上有不少VC的服务
程序必须是MSSOAPTOOL KIT3.0。另一方面服务端用VC有存在上面问题,唉!
 
最后打算采用microsoft的方法了,在CB中用TOOLKIT3。0。
碰到问题,用变体获取服务端的数据,如果变体内数据为一个自定义的类,读出
总是不对。如:
TmyList
{
int cout;
AnsiString title;
}
TmyList *pList;
Variant V;
----
---
V = olefunction(...)//获取数据
pList = &amp;V;
Edit1->Text = pList->title;//运行出错,WHY??
在cb中如何操纵??急啊!
 
最后采用MSSOAPTOOL KIT,解决问题。
不过如采用BORLAND的方法也不知,有人知道吗告诉我一声,谢谢!
地址:NetLL@21cn.com.
先不结束,关于该问题可以继续讨论。
 
有一种办法你可以试试:
在传递之前,将结构的内容写入流中,以字符流的方式传递,
接收后再从字符流中将数据读出来。
 
顶部