不知WebService中是否可以按引用传递参数,按理来说应该是不可以的,把一个引用传递到远程客户端能读出实际的值吗?不过我做了个小例子却是可以的,比如:
WebService 中:
function GetMsg(var msg: string): string;
begin
msg:= 'You enter is ' + msg;
Result:= msg;
end;客户端调用:
var
Intf: Iaa; //WebService 中的接口
msg: string;
begin
HTTPRIO1.URL:= 'http://192.168.3.185:1240/soap/Iaa';WebService 地址
Intf:= HTTPRIO1 as Iaa;
msg:= 'msg aa';
ShowMessage(Intf.GetStr(msg)); //显示为 You enter is msg aa
ShowMessage(msg); //显示为 You enter is msg aa
end;这样看的话还是能够按引用传递参数的,只是我不明白其中的原理,期待高手指点一下。
WebService 中:
function GetMsg(var msg: string): string;
begin
msg:= 'You enter is ' + msg;
Result:= msg;
end;客户端调用:
var
Intf: Iaa; //WebService 中的接口
msg: string;
begin
HTTPRIO1.URL:= 'http://192.168.3.185:1240/soap/Iaa';WebService 地址
Intf:= HTTPRIO1 as Iaa;
msg:= 'msg aa';
ShowMessage(Intf.GetStr(msg)); //显示为 You enter is msg aa
ShowMessage(msg); //显示为 You enter is msg aa
end;这样看的话还是能够按引用传递参数的,只是我不明白其中的原理,期待高手指点一下。
WS是基于HTTP协议的,在传参时会把对象或数据转成XML而后传递。在WS使用普通参数与变参传递的根本区别是在服务器响应事件后,会多发一条信息来更新本地的变参变量。
如:
函数中有变参,服务器response后的stream应该是这样 <return xsi:type="xsd:string">You enter is msg aa</return>
<msg xsi:type="xsd:string">You enter is msg aa</msg>函数中无变参时,是这样 <return xsi:type="xsd:string">You enter is msg aa</return>
感谢liangpei2008,不过还有点小疑问,通常说按引用传递传的是指针(指向该变量的一个内存地址),这样说的话,把一个指针传递给远程的客户端或服务端,那接收方如何知道这个地址指向的变量的实际值呢。还是说其实传递的不是地址,而是把所有内容都传递过去?
另如何截取WS的包?望liangpei2008指点一二,谢谢!
传递的是内容,而不是地址!
做为远程调用,二个进程的内存空间都不在一起,不可能用指针来实现的引用传递的。
2.
procedure TForm1.htpr1AfterExecute(const MethodName: String;
SOAPResponse: TStream);
begin
(SOAPResponse as TMemoryStream).SavetoFile();
//或者用HttpWatch来监测
end;