关于 soap / web server 服务返回数据类型的问题
在soap / web server的业务中 返回类型经常是数据集,我定义如下结构
在编译过程没有问题。Type
TSoapDataSet = Class( TRemotable )
Private
FDataset : TDataSet;
FName : String;
published
Property Name : String Read FName Write FName;
Property Dataset : TDataSet Read FDataSet Write FDataSet;
end;
但是在在ie 地址
http://localhost:1024/PlatSoapSvr.PlatSoapServer/wsdl/ISoapServer
内容出现 ,说dataset 类型不识别。
在delphi 里导入也是如此。- <xs:complexType name="TSoapDataSet">
- <xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Dataset" type="xs:" />
</xs:sequence>
</xs:complexType>
请问各位老大该如何是好。我想是否可以使用xml传递数据集。该如何做。谢谢
在soap / web server的业务中 返回类型经常是数据集,我定义如下结构
在编译过程没有问题。Type
TSoapDataSet = Class( TRemotable )
Private
FDataset : TDataSet;
FName : String;
published
Property Name : String Read FName Write FName;
Property Dataset : TDataSet Read FDataSet Write FDataSet;
end;
但是在在ie 地址
http://localhost:1024/PlatSoapSvr.PlatSoapServer/wsdl/ISoapServer
内容出现 ,说dataset 类型不识别。
在delphi 里导入也是如此。- <xs:complexType name="TSoapDataSet">
- <xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Dataset" type="xs:" />
</xs:sequence>
</xs:complexType>
请问各位老大该如何是好。我想是否可以使用xml传递数据集。该如何做。谢谢
解决方案 »
- ▲▲▲ 如何定时结束指定的进程(例如结束任务管理器的shutdown.exe进程)▲▲▲
- 如何在子窗口中判断该窗口是由哪个父窗口打开的?
- 求一个简单的方法
- 开发类似联众那样的客户端该如何做?
- 如何在代码中查找当前变量所定义的位置?急!
- dbgrid里的内容怎么导入到excel或者文本文件
- 我在服务器端用server.socket的非阻塞式开了300个线程,客户端同样也是用的非阻塞式通讯。为什么当服务器连接到42个客户端的时候其它的客
- 在adocommand里创建存储过程为什么不行?路过帮我看一看。
- 怎样用程序得到共享文件的共享名?在线等待!
- 如何以空格为界把字符串读到数组中
- 在程序运行的时候怎样把TGroupBox控件的框去掉
- 几个问题??
但是使用dataset错了。
ClientDataSet1.XMLData := soap返回的xml数据,
我现在就遇到了这个问题,虽然注册了,但在客户端还是不可识别,不知原因,
请教大家了。
TSoapDataSet = Class( TRemotable )
Private
FXMLData : string;
FName : String;
published
Property Name : String Read FName Write FName;
Property XMLData : string Read FXMLData Write FXMLData;
end;这里的XMLData就是一个字符串,用它来存放要返回的Dataset数据,而这个数据可以用ClientDataset进行包装,读取ClientDataset.XMLDataset来获得。这样就用最小的代价实现了数据远程传递。如果不像这么做的话,也可以用varByte VariantArray来进行数据包装和解包(实际上就是序列化/反序列化)。
因为DataSet是不是SOAP支持的标准数据类型,你必须定义一对函数实现DataSet和XML之间互相转换,具体方法可以参考DELPHI的XSBuiltIns单元的源码。
猛禽说的这个转换就是序列化
在后边我定义新的接口,然后对此接口做统一的数据类型定义。并在webserver 使用动态执行函数, @func:=Self.MethodAddress('abc');
if Assigned(@func) then
func(Self);
其中abc 函数在服务器 开发,并使用统一接口。这样 客户段不需要每次引用服务。客户段只需要按 统一接口调用服务器的功能就可以拉。
(现在我在服务器又加了执行脚本的功能)关于 这 现在碰到主要问题是统一的接口,我想其中关键问题就是 “对象的序列化”在java vc里 object这样的基类就把序列化功能实现。而delphi 中 在TRemotableXS 继承实现。目前对这块没有更好的办法。
不知道各位老大有什么好的办法另外有人说我又跑到dcom里的圈子里去了。
有soap的简单和穿透力,又有com的统一规范。多好。
比如创建一个类,具备
function toString(AObject: TObject): string;
和
function fromString(const RTTIXML: string):TObject;
两个方法,toString函数把对象的RTTI包装成XML,而FromString则反向还原,中间SOAP传递的仍然是XML字符串