2012-03-22 7 views
2

얼마전 델파이 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.OpenCursorProviderName = '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 오류가 실제로 의미하는 바는 무엇이며 왜 그런 일이 일어나며 어떻게 해결할 수 있습니까?

+1

나는 프록시 (Fiddler)를 사용하고 작동중인 (WAD) 버전과 작동하지 않는 버전의 요청/담당자를 비교합니다. URL이 작동 중일 수 있지만 브라우저는 HTTP GET 요청을 보내고 SOAP은 일반적으로 POST도 사용합니다. – mjn

답변

1

이 경우 클라이언트가 서버 측에서 예외가 발생했다는 통지를 받았음을 의미합니다. 서버 측의 예외가 데모 코드의 문제로 인해 발생했기 때문에 해결책은 데모 서버를 복구하여 제대로 작동하도록하는 것입니다.

Delphi 2007과 함께 제공되는 SOAP 서버의 경우 SoapDataModule 샘플 폴더에서 오류 검사가 없다는 점이 문제입니다. 데이터 폴더가 이동했거나 없기 때문에 XML 샘플 데이터를로드하지 못하면 서버 측에서 처리되지 않은 예외로 폭발합니다.

SOAP은 당신을 위해 작업을 자동화하는 훌륭한 속성을 가지고 있습니다. 클라이언트는 우리가 비누 호출을 수신했다는 통지를 수신하고 실제 응답 대신 비누 예외를 다시받습니다. 여기서는 SOAP을 비난 할 수 없으며 Delphi SOAP RTL은 실제로 사용하기에 꽤 친숙합니다. 그러나 여기에서 벗어나기위한 근본적인 요점은 비누 서비스 구현자가 비누 서버가 시작될 때 비누 검사를해야하므로 SOAP 요청에 치명적이기 전에 오류를 복구 할 수 있어야한다는 것입니다.

학습 된 내용; SOAP 서버를 구성 할 때 첫 번째 SOAP 서버 세션 전에 구성 오류 처리 및 치명적 오류 감지를 시작 작업으로 고려하십시오.