얼마전 델파이 XE 이상에서 동작하는 비누 클라이언트 및 서버를 묻는 질문이 another SOAP related question 번이었습니다.SOAP를 사용하여 델파이에서 SOAP를 통해 클라이언트 데이터 세트로 데이터를 원격으로 읽을 때 XML 구문 분석 오류가 TXMLTransform에서 보낸 의미는 무엇입니까?
아무도 해결책을 찾지 못했으므로 Delphi 2007의 시대 데모를 Delphi XE 및 XE2의 작동 상태로 복원했습니다. 데모가 작동하고 있고, Indy VCL 폼 기반 서버 (Indy에서 실행중인 독립형 HTTP 서버)에 Soap 서버가 있습니다. 서버 데모의 두 부분은 "사용자 정의 방법"(일반 비누 함수 호출)과 "원격 데이터 집합"입니다. 내가 작업 할 수없는 원격 데이터 세트입니다.
가내가 데모 클라이언트에서이 줄을 수행 할 때 나는 클라이언트 데이터 셋 활성으로 설정하면 내가 가지고있는 클라이언트 형태 오류는 서버가 예외를 다시 보냅니다
차례ClientDataSet1.Open;
이가 다운
이Result := AppServer.AS_GetRecords(ProviderName, Count, RecsOut, Options,
CommandText, Params, OwnerData);
// ProviderName = 'XMLTransformProvider1', Count = -1,
// CommandText = '', Params = NULL, OwnerData = Unassigned
이일반에 표시된이 예외로 불면 : DBClient.pas 코드로, TDataSet.OpenCursor
는 ProviderName = 'XMLTransformProvider1'
, 에서이 RIO 호출 읽을려고 DoGetRecords
를 호출 3,615,247,513,210 형식 : 인디 비누 데이터 모듈에 대한 서버 측 예외 호출 스택이 여기에 표시됩니다
`ERemotableException: XML Parse error...`.
ERemotableException
'XML Parse Error:
Reason: The system cannot locate the object specified.
'.
는 :
xmlutil.DocParseError(TMSDOMDocument($292C994) as IDOMDocument)
xmlutil.LoadDocFromFile(???)
Xmlxform.TXMLTransform.GetData
Xmlxform.TXMLTransformProvider.InternalGetRecords(???,???,[grMetaData],'',Null)
Provider.TCustomProvider.DoGetRecords(-1,0,1,'',Null,Null)
Provider.TCustomProvider.GetRecords(???,0,1,'',Null,Null)
SOAPDm.TSoapDataModule.GetRecords('XMLTransformProvider1',-1,0,1,'',Null,Null)
SOAPDm.TSoapDataModule.SAS_GetRecords('XMLTransformProvider1',-1,0,1,'',Null,Null)
Invoker.TInterfaceInvoker.Invoke(???,('IDataMod', 'DataMod_U', (('', ccReg, 0, 0, nil, nil,(), False), ('', ccReg, 0, 0, nil, nil,(), False), ('', ccReg, 0, 0, nil, nil,(), False), ('SAS_ApplyUpdates', ccStdCall, 3, 5, $401314, $628D50, (([pfConst], 'ProviderName', $4012DC), ([pfReference], 'Delta', $401314), ([], 'MaxErrors', $4010A0), ([pfOut], 'ErrorCount', $4010A0), ([pfVar,pfReference], 'OwnerData', $401314), ([], '', nil)), True), ('SAS_GetRecords', ccStdCall, 4, 7, $401314, $628D50, (([pfConst], 'ProviderName', $4012DC), ([], 'Count', $4010A0), ([pfOut], 'RecsOut', $4010A0), ([], 'Options', $4010A0), ([pfConst], 'CommandText', $4012DC), ([pfVar,pfReference], 'Params', $401314), ([pfVar,pfReference], 'OwnerData', $401314), ([], '', nil)), True), ('SAS_DataRequest', ccStdCall, 5, 2, $401314, $628D50, (([pfConst], 'ProviderName', $4012DC), ([pfReference], 'Data', $401314), ([], '', nil)), True), ('SAS_GetProviderNames', ccStdCall, 6, 0, $40BC38, $628D50, (([], '', nil)), True), ('SAS_GetParams', ccStdCall, 7, 2, $401314, $628D50, (([pfConst], 'ProviderName', $4012DC), ([pfVar,pfReference], 'OwnerData', $401314), ([], '', nil)), True), ('SAS_RowRequest', ccStdCall, 8, 4, $401314, $628D50, (([pfConst], 'ProviderName', $4012DC), ([pfReference], 'Row', $401314), ([], 'RequestType', $4010A0), ([pfVar,pfReference], 'OwnerData', $401314), ([], '', nil)), True), ('SAS_Execute', ccStdCall, 9, 4, nil, $628D50, (([pfConst], 'ProviderName', $4012DC), ([pfConst], 'CommandText', $4012DC), ([pfVar,pfReference], 'Params', $401314), ([pfVar,pfReference], 'OwnerData', $401314), ([], '', nil)), True), ('CustomMethod', ccStdCall, 10, 0, $4012CC, $62E668, (([], '', nil)), True)), (45872836, 16917, 16768, (153, 166, 192, 149, 84, 207, 120, 216)), $62E668, $628D50, 10),4,$2942270)
SOAPPasInv.TSoapPascalInvoker.Invoke(???,???,'',$28F3700,$28F36A0,???)
SOAPHTTPPasInv.THTTPSoapPascalInvoker.DispatchSOAP('/SOAPDMServerWAD.Sample/soap/IDataMod',???,$28F3700,$28F36A0,btSoap)
WebBrokerSOAP.THTTPSoapDispatcher.DispatchRequest(???,???,$29421C8)
HTTPApp.DispatchHandler($28E4140,THTTPSoapDispatcher($291687C) as IWebDispatch,$290FEA0,$29421C8,False)
HTTPApp.TCustomWebDispatcher.DispatchAction($290FEA0,$29421C8)
HTTPApp.TCustomWebDispatcher.HandleRequest(???,???)
HTTPApp.TDefaultWebAppServices.InvokeDispatcher
HTTPApp.TDefaultWebAppServices.HandleRequest
WebReq.TWebRequestHandler.HandleRequest($290FEA0,$29421C8)
IdHTTPWebBrokerBridge.TIdHTTPWebBrokerBridgeRequestHandler.Run(???,$28851B0,???)
IdHTTPWebBrokerBridge.TIdHTTPWebBrokerBridge.DoCommandGet(???,???,???)
IdCustomHTTPServer.TIdCustomHTTPServer.DoExecute($293AB30)
IdContext.TIdContext.Run
IdTask.TIdTask.DoRun
IdThread.TIdThreadWithTask.Run
IdThread.TIdThread.Execute
Classes.ThreadProc($28A1FE0)
내가 무슨 일이 일어나고 믿는 것은 우리가 빈 HTTP 응답을 얻고있는 것입니다. 이것은 아무런 효과가 없다면 나에게 완벽하게 이해 될 것이며, 우리가 접근하는 HTTP URL은 작동하지 않는다. 우리가 액세스하는 URL은, 웹 브라우저를 통해 액세스 할 수 있습니다 :
http://localhost:8088/?intf=IDataMod
오류 메시지를 발생시킨 클라이언트에 다시오고 XML은 다음과 같습니다
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<faultcode>SOAP-ENV:Server</faultcode>
<faultstring>XML Parse Error:'#$D#$A#$D#$A'Reason: The system cannot locate the object specified.'#$D#$A#$D#$A#$D#$A'</faultstring>
<faultactor/>
</SOAP-ENV:Fault>
</SOAP-ENV:Body></SOAP-ENV:Envelope>
내 질문 SOAP 오류가 실제로 의미하는 바는 무엇이며 왜 그런 일이 일어나며 어떻게 해결할 수 있습니까?
나는 프록시 (Fiddler)를 사용하고 작동중인 (WAD) 버전과 작동하지 않는 버전의 요청/담당자를 비교합니다. URL이 작동 중일 수 있지만 브라우저는 HTTP GET 요청을 보내고 SOAP은 일반적으로 POST도 사용합니다. – mjn