为什么Delphi 6调用C#的WebService,只要调用传入参数是string类型的函数就报错?该如何处理
为什么Delphi 6调用C#的WebService,只要调用传入参数是string类型的函数就报错?
SOAP Response Packet: result element expected, received "<ConfrimResponse xmlns="http://tempuri.org/"/>"
WebService应该没问题,用C#调完全正常,而且用Delphi调,不需要string参数的函数都没问题,返回类型是string也没问题。
D6是古董了点,但暂时不能动,请高手们提供个解决方法。
------解决方案--------------------
好像WebService返回的都是WideString。但这两个类型是否可强制转换,不知道了。
------解决方案--------------------
转为Pchar类型传入试试
------解决方案--------------------
PChar类型可以,
String是第一位是字符串的长度,从第二位开始才是真正的数据
------解决方案--------------------
估计是字符集的问题吧,用utf-8试试看
------解决方案--------------------
用WideString
------解决方案--------------------
两种数据类型不一样要转换一下.
------解决方案--------------------
好像没那么复杂,这是我的应用:
SOAP Response Packet: result element expected, received "<ConfrimResponse xmlns="http://tempuri.org/"/>"
WebService应该没问题,用C#调完全正常,而且用Delphi调,不需要string参数的函数都没问题,返回类型是string也没问题。
D6是古董了点,但暂时不能动,请高手们提供个解决方法。
------解决方案--------------------
好像WebService返回的都是WideString。但这两个类型是否可强制转换,不知道了。
------解决方案--------------------
转为Pchar类型传入试试
------解决方案--------------------
PChar类型可以,
String是第一位是字符串的长度,从第二位开始才是真正的数据
------解决方案--------------------
估计是字符集的问题吧,用utf-8试试看
------解决方案--------------------
用WideString
------解决方案--------------------
两种数据类型不一样要转换一下.
------解决方案--------------------
好像没那么复杂,这是我的应用:
- Delphi(Pascal) code
//以下是Delphi生成的WebService调用 unit version; interface uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns; type // ************************************************************************ // // The following types, referred to in the WSDL document are not being represented // in this file. They are either aliases[@] of other types represented or were referred // to but never[!] declared in the document. The types from the latter category // typically map to predefined/known XML or Borland types; however, they could also // indicate incorrect WSDL documents that failed to declare or import a schema type. // ************************************************************************ // // !:string - "http://www.w3.org/2001/XMLSchema" // ************************************************************************ // // Namespace : http://csyangpeng.cn/ // soapAction: http://csyangpeng.cn/%operationName% // transport : http://schemas.xmlsoap.org/soap/http // binding : VersionSoap // service : Version // port : VersionSoap // URL : http://www.MyService.com/services/version.asmx // ************************************************************************ // VersionSoap = interface(IInvokable) ['{B274BBBB-F68D-7338-454D-6E33B840DEBE}'] function GetDataURL: WideString; stdcall; function GetSSJKURL: WideString; stdcall; function GetVersion: WideString; stdcall; function GetDataVersion: WideString; stdcall; procedure SetDataVersion; stdcall; end; function GetVersionSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): VersionSoap; implementation uses UniMain; function GetVersionSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): VersionSoap; const defSvc = 'Version'; defPrt = 'VersionSoap'; var RIO: THTTPRIO; begin Result := nil; if (Addr = '') then begin if UseWSDL then //Addr := defWSDL Addr := MainForm.edtWebService.Text+'?wsdl' else //Addr := defURL; Addr := MainForm.edtWebService.Text; end; if HTTPRIO = nil then RIO := THTTPRIO.Create(nil) else RIO := HTTPRIO; try Result := (RIO as VersionSoap); 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(VersionSoap), 'http://csyangpeng.cn/', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(VersionSoap), 'http://csyangpeng.cn/%operationName%'); end.
------解决方案--------------------
要看你接口单元中confirm里面生成的是什么类型的了,最好把代码贴出来看看