delphi开发WebService问题:
我在服务器端定义了一个函数SetCnt(…)用于客户端改变服务器端的SQLConnection属性,客户端调用返回成功(True),可是,当我查询SQL时发现SQLConnection的属性并没有改变。客户端调用SetCnt(…)我使用了“(HTTPRIO1 as ISoapDemo3DM).SetCnt('DB2Connection','FMISDB2','DBO','DBO')”,而查询SQL使用了SoapConnection。我猜想:是不是两种调用所使用的实例并不是同一个?请帮我看看,谢谢。
====================================================================
Server Side
------
Unit USoapDemo3DM;interfaceuses SysUtils, Classes, InvokeRegistry, Midas, SOAPMidas, SOAPDm, DBXpress,
FMTBcd, Provider, DB, SqlExpr, USvrMain;type
ISoapDemo3DM = interface(IAppServerSOAP)
['{43F7A387-4B03-47AD-A46A-BEB6DE866BE1}'] function SetCnt(const CntName,Database,User_Name,Password: String): Boolean; stdcall;
end; TSoapDemo3DM = class(TSoapDataModule, ISoapDemo3DM, IAppServerSOAP, IAppServer)
SQLConnection1: TSQLConnection;
SQLDataSet1: TSQLDataSet;
DataSetProvider1: TDataSetProvider;
private public
function SetCnt(const CntName,Database,User_Name,Password: String): Boolean; stdcall;
end;implementation{$R *.DFM}procedure TSoapDemo3DMCreateInstance(out obj: TObject);
begin
obj := TSoapDemo3DM.Create(nil);
end;{ TSoapDemo3DM }function TSoapDemo3DM.SetCnt(const CntName,Database,User_Name,Password: String): Boolean;
begin
try
with SQLConnection1 do
begin
Connected := False;
ConnectionName := CntName;
Params.Values['Database'] := Database;
Params.Values['User_Name'] := User_Name;
Params.Values['Password'] := Password;
end;
Result := True;
except on e: Exception do
Result := False;
end;
end;initialization
InvRegistry.RegisterInvokableClass(TSoapDemo3DM, TSoapDemo3DMCreateInstance);
InvRegistry.RegisterInterface(TypeInfo(ISoapDemo3DM));
end.Client Side
------
procedure TForm2.Button2Click(Sender: TObject);
var B: Boolean;
begin
B := (HTTPRIO1 as ISoapDemo3DM).SetCnt('DB2Connection','FMISDB2','DBO','DBO');
if B then Application.MessageBox('','True') else
Application.MessageBox('','False');
ClientDataSet1.Active := False;
ClientDataSet1.CommandText := Edit1.Text;
ClientDataSet1.Active := True;
end;
我在服务器端定义了一个函数SetCnt(…)用于客户端改变服务器端的SQLConnection属性,客户端调用返回成功(True),可是,当我查询SQL时发现SQLConnection的属性并没有改变。客户端调用SetCnt(…)我使用了“(HTTPRIO1 as ISoapDemo3DM).SetCnt('DB2Connection','FMISDB2','DBO','DBO')”,而查询SQL使用了SoapConnection。我猜想:是不是两种调用所使用的实例并不是同一个?请帮我看看,谢谢。
====================================================================
Server Side
------
Unit USoapDemo3DM;interfaceuses SysUtils, Classes, InvokeRegistry, Midas, SOAPMidas, SOAPDm, DBXpress,
FMTBcd, Provider, DB, SqlExpr, USvrMain;type
ISoapDemo3DM = interface(IAppServerSOAP)
['{43F7A387-4B03-47AD-A46A-BEB6DE866BE1}'] function SetCnt(const CntName,Database,User_Name,Password: String): Boolean; stdcall;
end; TSoapDemo3DM = class(TSoapDataModule, ISoapDemo3DM, IAppServerSOAP, IAppServer)
SQLConnection1: TSQLConnection;
SQLDataSet1: TSQLDataSet;
DataSetProvider1: TDataSetProvider;
private public
function SetCnt(const CntName,Database,User_Name,Password: String): Boolean; stdcall;
end;implementation{$R *.DFM}procedure TSoapDemo3DMCreateInstance(out obj: TObject);
begin
obj := TSoapDemo3DM.Create(nil);
end;{ TSoapDemo3DM }function TSoapDemo3DM.SetCnt(const CntName,Database,User_Name,Password: String): Boolean;
begin
try
with SQLConnection1 do
begin
Connected := False;
ConnectionName := CntName;
Params.Values['Database'] := Database;
Params.Values['User_Name'] := User_Name;
Params.Values['Password'] := Password;
end;
Result := True;
except on e: Exception do
Result := False;
end;
end;initialization
InvRegistry.RegisterInvokableClass(TSoapDemo3DM, TSoapDemo3DMCreateInstance);
InvRegistry.RegisterInterface(TypeInfo(ISoapDemo3DM));
end.Client Side
------
procedure TForm2.Button2Click(Sender: TObject);
var B: Boolean;
begin
B := (HTTPRIO1 as ISoapDemo3DM).SetCnt('DB2Connection','FMISDB2','DBO','DBO');
if B then Application.MessageBox('','True') else
Application.MessageBox('','False');
ClientDataSet1.Active := False;
ClientDataSet1.CommandText := Edit1.Text;
ClientDataSet1.Active := True;
end;
调用扩展接口不需要另外再加HTTPRIO:(HTTPRIO1 as ISoapDemo3DM).SetCnt
只要这样即可:(SOAPConnection1.RIO As ISoapDemo3DM).SetCnt即可。SESSION行不通,就只有研究一下是不是能在SOAP请求/响应头里做文章了,那样就需要研究DELPHI中是如何实现SOAP的,麻烦多了:(
SOAPConnection1的url为“http://localhost:8081/PServer.SoapDemo3/soap”。还有,通过SOAPConnection1的clientdataset工作正常。
它定义了两个PRIVATE成员:FRIO和FHTTPRIO,实际用的是FRIO,FHTTPRIO根本没用,而那个属性返回的是FHTTPRIO:(
在客户端IMPORT WSDL
设置SOAPConnection的SOAPServerIID为导入的ISoapDemo3DM接口的IID(注意:不是服务端这个:{43F7A387-4B03-47AD-A46A-BEB6DE866BE1})
然后用:(SOAPConnection1.GetSOAPServer As ISoapDemo3DM).SetCnt
即可