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;

解决方案 »

  1.   

    是的,WebService是通过Web技术实现的,而Web应用的一大特点就是无状态,你需要借助Session等的辅助才行。至于在WebService中如何使用Session还是个问题,我研究一哈先:)
      

  2.   

    失败:(SOAP的WEB MODULE与一般WEB应用的不同,我加了SESSION以后就变成HTML的了,而SOAP是要XML的:(不过你的程序还是有一个问题:
    调用扩展接口不需要另外再加HTTPRIO:(HTTPRIO1 as ISoapDemo3DM).SetCnt
    只要这样即可:(SOAPConnection1.RIO As ISoapDemo3DM).SetCnt即可。SESSION行不通,就只有研究一下是不是能在SOAP请求/响应头里做文章了,那样就需要研究DELPHI中是如何实现SOAP的,麻烦多了:(
      

  3.   

    当我调用:(SOAPConnection1.RIO As ISoapDemo3DM).SetCnt时,SOAPConnection1.RIO为nil,不知是什么原因?
    SOAPConnection1的url为“http://localhost:8081/PServer.SoapDemo3/soap”。还有,通过SOAPConnection1的clientdataset工作正常。
      

  4.   

    SOAPConnection1必须先OPEN以后才能用它的RIO
      

  5.   

    不行啊,Open后还是为nil。等你回帖,我就揭帖。:-(
      

  6.   

    偶要向你忏悔,是偶看错了,的确是RIO=NIL。因为DELPHI7的BUG,我看了它的源码,是一个非常明显的BUG:(
    它定义了两个PRIVATE成员:FRIO和FHTTPRIO,实际用的是FRIO,FHTTPRIO根本没用,而那个属性返回的是FHTTPRIO:(
      

  7.   

    再补充,我刚才改了SOAPCONN的源码,但RIO还是不能用,所以这个方法不可行。可用的方法是:
    在客户端IMPORT WSDL
    设置SOAPConnection的SOAPServerIID为导入的ISoapDemo3DM接口的IID(注意:不是服务端这个:{43F7A387-4B03-47AD-A46A-BEB6DE866BE1})
    然后用:(SOAPConnection1.GetSOAPServer As ISoapDemo3DM).SetCnt
    即可