现有服务端的接口交互统一采用WEBSERVICE(Apache Axis)技术实现。在客户端用D7开发,调用接口函数后提示"参数不正确"部分代码如下:  GdjkServer = interface(IInvokable)
    ['{4FD9DCBA-D0D6-4B33-8DA7-6C4D4A653143}']
    procedure LOGIN(const argXml: WideString; out LOGINReturn: Boolean);  stdcall;
    procedure saveSaleInfo(const argXml: WideString; out saveSaleInfoReturn: WideString);  stdcall;
    procedure delSaleInfo(const argXml: WideString; out delSaleInfoReturn: WideString);  stdcall;
    procedure getUserInfo(const argXml: WideString; out getUserInfoReturn: WideString);  stdcall;
    procedure getSaleInfo(const argXml: WideString; out getSaleInfoReturn: WideString);  stdcall;
    procedure getSysDate(out getSysDateReturn: WideString);  stdcall;
  end;
以上这部分代码是DELPHI的IMPORT自动产生的procedure TForm1.Button1Click(Sender: TObject);
const
  defWSDL = 'http://10.136.33.124:7001/web/services/GdjkServer?wsdl';
  defSvc  = 'GdjkServerService';
  defPrt  = 'GdjkServer';
var
  RIO : THTTPRIO;
  ICGdjk:GdjkServer;
  sysDate:widestring;
begin
  RIO := THTTPRIO.Create(nil);
  RIO.WSDLLocation := defWSDL;
  RIO.Service := defSvc;
  RIO.Port := defPrt;
  ICGdjk:=RIO as GdjkServer;
  ICGdjk.getSysDate(sysDate);   //运行后报错
  showmessage(sysDate);
end;在服务端观察没有收到请求的数据包.请各位指教

解决方案 »

  1.   

    //c#编写webservice
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Web;
    using System.Web.Services;namespace WebService1
    {
    /// <summary>
    /// Service1 的摘要说明。
    /// </summary>
    public class Service1 : System.Web.Services.WebService
    {
    public Service1()
    {
    //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
    InitializeComponent();
    } #region 组件设计器生成的代码

    //Web 服务设计器所必需的
    private IContainer components = null;

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if(disposing && components != null)
    {
    components.Dispose();
    }
    base.Dispose(disposing);
    }

    #endregion // WEB 服务示例
    // HelloWorld() 示例服务返回字符串 Hello World
    // 若要生成,请取消注释下列行,然后保存并生成项目
    // 若要测试此 Web 服务,请按 F5 键 [WebMethod]
    public string HelloWorld()
    {
    return "Hello World";
    }
    }
    }//import wsdl部分
    unit Service1;interfaceuses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;type
      Service1Soap = interface(IInvokable)
      ['{CFE467D4-A39E-2BD2-5836-7685A9E27F8D}']
        function  HelloWorld: WideString; stdcall;
      end;function GetService1Soap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): Service1Soap;
    implementationfunction GetService1Soap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): Service1Soap;
    const
      defWSDL = 'http://localhost/WebService1/Service1.asmx?wsdl';
      defURL  = 'http://localhost/WebService1/Service1.asmx';
      defSvc  = 'Service1';
      defPrt  = 'Service1Soap';
    var
      RIO: THTTPRIO;
    begin
      Result := nil;
      if (Addr = '') then
      begin
        if UseWSDL then
          Addr := defWSDL
        else
          Addr := defURL;
      end;
      if HTTPRIO = nil then
        RIO := THTTPRIO.Create(nil)
      else
        RIO := HTTPRIO;
      try
        Result := (RIO as Service1Soap);
        if UseWSDL then
        begin
          RIO.WSDLLocation := Addr;
          RIO.Service := defSvc;
          RIO.Port := defPrt;
        end else
          RIO.URL := Addr;
      finally
        if (Result = nil) and (HTTPRIO = nil) then
          RIO.Free;
      end;
    end;
    initialization
      InvRegistry.RegisterInterface(TypeInfo(Service1Soap), 'http://tempuri.org/', 'utf-8');
      InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Service1Soap), 'http://tempuri.org/HelloWorld');
      InvRegistry.RegisterInvokeOptions(TypeInfo(Service1Soap), ioDocument);end.//调用部分
    var
      ss:Service1Soap;
      RIO : THTTPRIO;
    begin
      RIO:= THTTPRIO.Create( Owner );
      ss:=RIO as Service1Soap;
      RIO.WSDLLocation:= 'http://localhost/WebService1/Service1.asmx?wsdl';
      showmessage( ss.HelloWorld );
    end;//结果
    Hello World
      

  2.   

    WebService 是用什么语言开发的?
    用这种方式第一次读数据会比较慢。
      

  3.   

    还是编码问题 
    建议使用D2007生成import wsdl 或者用2007写个DLL封装函数
    D2006及D7以前的import都有问题 很容易出现乱码问题
    你那个 你可以看看SERVICE端是不是用的UTF8头 在HTTPRIO属性里加个UTF8INHEADER 可能就不会出现 无效的错误 但是还是很有可能出乱码