我有一个用delphi创建的SOAP应用程序.
输入到服务器正确.但输出总是空的. r对象(响应)创建,但长度(r.notes)总是0.如果我没有数组的应用程序,它也正常工作.哪里有问题?谷歌搜索和尝试不同组合3天没有帮助.
接口:
////////////// INPUT /////////////////////// type TClientInformationStructure= class(TRemotable) private fClientApplicationName:string; fClientApplicationPassword:string; fRequestIdentifier:string; fStartSequenceNumber:integer; fNumberOfNotes:integer; published property ClientApplicationName:string read fClientApplicationName write fClientApplicationName; //Name of calling application property ClientApplicationPassword:string read fClientApplicationPassword write fClientApplicationPassword; //Password that calling application must use to call the service property RequestIdentifier:string read fRequestIdentifier write fRequestIdentifier;//Transaktionsid from calling system that is stamped in all loggings for service,//so that later it is easy to compare client and server logs. May be null. property StartSequenceNumber:integer read fStartSequenceNumber write fStartSequenceNumber; property NumberOfNotes:integer read fNumberOfNotes write fNumberOfNotes; end; ///////////// OUTPUT //////////////////////////// Type TNote=class(tremotable) private fNotetId:string; fSequenceNumber:integer; fDeleteMark:boolean; fAuthorRole:string; fAuthorUserName:string; fAuthor:string; fAcceptTime:tdateTime; fOrganizationalUnit:string; fLocationStartTime:tdateTime; fLocationEndTime:TdateTime; fBeadWard:string; fPersonCivilRegistrationIdentifier:string; fNoteType:string; fNoteText:string; fMoreNotesAvailable:boolean; public property NotetId:string read fNotetId write fNotetId; property SequenceNumber:integer read fSequenceNumber write fSequenceNumber; property DeleteMark:boolean read fDeleteMark write fDeleteMark; property AuthorRole:string read fAuthorRole write fAuthorRole; property AuthorUserName:string read fAuthorUserName write fAuthorUserName; property Author:string read fAuthor write fAuthor; property AcceptTime:tdateTime read fAcceptTime write fAcceptTime; property OrganizationalUnit:string read fOrganizationalUnit write fOrganizationalUnit; property LocationStartTime:tdateTime read fLocationStartTime write fLocationStartTime; property LocationEndTime:TdateTime read fLocationEndTime write fLocationEndTime; property BeadWard:string read fBeadWard write fBeadWard; property PersonCivilRegistrationIdentifier:string read fPersonCivilRegistrationIdentifier write fPersonCivilRegistrationIdentifier; property NoteType:string read fNoteType write fNoteType; property NoteText:string read fNoteText write fNoteText; property MoreNotesAvailable:boolean read fMoreNotesAvailable write fMoreNotesAvailable; end; type TnoteStructure = array of TNote; type tNoteCollection=class(tremotable) private fnotes:TnoteStructure; public property notes:TnoteStructure read fnotes write fnotes; end; type ibla = interface(IInvokable) ['{FFD831EC-56B1-4C0E-9CCE-8D9C7ECEE656}'] function GetNotes(ClientInformationStructure:TClientInformationStructure) : tNoteCollection; stdcall; end; implementation initialization RemClassRegistry.RegisterXSClass(TClientInformationStructure); RemClassRegistry.RegisterXSClass(Tnote); RemClassRegistry.RegisterXSClass(tNoteCollection); RemClassRegistry.RegisterXSInfo(TypeInfo(TnoteStructure)); InvRegistry.RegisterInterface(TypeInfo(ibla)); finalization RemClassRegistry.UnRegisterXSClass(TClientInformationStructure); RemClassRegistry.unRegisterXSClass(Tnote); RemClassRegistry.unRegisterXSClass(tNoteCollection); RemClassRegistry.unRegisterXSInfo(TypeInfo(TnoteStructure)); InvRegistry.UnRegisterInterface(TypeInfo(ibla)); end.
执行:
type Tbla = class(TInvokableClass,ibla) public function GetNotes(ClientInformationStructure:TClientInformationStructure) : TNotecollection; stdcall; end; implementation function Tbla.GetNotes(ClientInformationStructure:TClientInformationStructure) : TNotecollection; var n:tNoteStructure; begin try result:=TNotecollection.Create; setlength(n,1); n[0]:=tnote.create; n[0].NotetId:=inttostr(random(100)); n[0].AuthorUserName:='!1!'+ClientInformationStructure.ClientApplicationName; n[0].SequenceNumber:=999; result.notes:=copy(n); except on e:exception do addtolog(e.Message) end; end; initialization InvRegistry.RegisterInvokableClass(Tbla) finalization InvRegistry.unRegisterInvokableClass(Tbla)
客户端:
c:=tclientinformationstructure.Create; try c.ClientApplicationName:=labelededit1.Text; c.ClientApplicationPassword:=labelededit2.Text; c.RequestIdentifier:=labelededit3.Text; c.StartSequenceNumber:=strtointdef(labelededit4.Text,0); c.NumberOfNotes:=strtointdef(labelededit5.Text,0); r:=(HTTPRIO1 as ibla).GetNotes(c); if assigned(r) then if length(r.notes)>0 then if assigned(r.notes[0]) then showmessage(r.notes[0].AuthorUserName); finally freeandnil(c); if assigned (r.notes[0]) then freeandnil(r.notes[0]); if assigned(r) then freeandnil(r); end;
解决方法
在服务器中,要转到SOAP Web模块,请选择HTTPSoapPascalInvoker组件,然后在Object Inspector中打开Options属性.确保选中“soRootRefNodesToBody”选项.这将确保在SOAP共振中,元素被传递到响应节点之外,在主体中,客户端可以在其中找到它们.
Groetjes,Bob Swart