现有服务端的接口交互统一采用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;在服务端观察没有收到请求的数据包.请各位指教
['{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;在服务端观察没有收到请求的数据包.请各位指教
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
用这种方式第一次读数据会比较慢。
建议使用D2007生成import wsdl 或者用2007写个DLL封装函数
D2006及D7以前的import都有问题 很容易出现乱码问题
你那个 你可以看看SERVICE端是不是用的UTF8头 在HTTPRIO属性里加个UTF8INHEADER 可能就不会出现 无效的错误 但是还是很有可能出乱码